代码之家  ›  专栏  ›  技术社区  ›  hummingBird

php文件随机存取与对象到文件保存

  •  3
  • hummingBird  · 技术社区  · 15 年前

    第一个字段 . 我成功地生成了一个函数,该函数使用 fseek公司 通过文件进行随机访问。

    下面是一个函数,它返回一行,其中包含位置处的字符

    
    function fgetLineContaining( $fh, $x ) {
            if( $x  125145411) // 12514511 is the last pos in my file
                return "";
            // now go as much left as possible, until newline is found
            // or beginning of the file
            while( $x > 0 && $c != "\n" && $c != "\r") {
                fseek($fh, $x);
                $x--; // go left in the file
                $c =  fgetc( $fh );
            }
            $x+=2; // skip newline char
            fseek( $fh, $x );
            return fgets( $fh, 1024 ); // return the line from the beginning until \n
        }
    
    

    虽然这是按预期工作,我不得不难过的是,我的csv文件有约1.5百万行,而这些左搜索正在减缓几乎下降。

    有没有更好的方法来寻找包含位置的线

    另外,如果一个类的对象可以保存到一个文件中而不序列化它,这样就可以逐对象读取一个文件对象。php支持吗?

    谢谢

    1 回复  |  直到 15 年前
        1
  •  1
  •   Kendall Hopkins    15 年前

    我认为您应该再次考虑使用SQLite或MySQL(就像其他人在评论中建议的那样)。大多数关于预计算索引的建议已经在这些SQL引擎中“正确”实现了。

    你说SQL的速度不够快。字段索引是否正确?你是怎么查询数据的?在哪里使用批量查询,在哪里使用准备好的语句?SQL进程是否有足够的ram将其索引存储在ram中?

    您甚至可以将整个文件读入PHP数组(假设您的计算机有足够的RAM)。这样你就可以通过索引进行搜索( $big_array[$offset]

    还有一点要记住,PHP在快速处理低级事务方面并不是非常快。你可能想考虑从C语言中移开有利于C或C++的PHP。