我想知道是否有人知道如何用PHP实现这个功能。我正在运行一个涉及打开文件、获取前1000行并对这些行进行一些操作的脚本,然后php文件会打开自身的另一个实例来获取接下来的1000行,以此类推直到读取完整个文件。我使用splfileobject可以定位到某一行,这使得我可以将文件分成1000行的块。但是,我遇到的最大问题是性能问题。我正在处理包含超过1000万行的文件,虽然它可以快速处理前10000行左右,但在那之后会出现巨大的指数级放缓,我认为这是因为需要定位到该点。
我想做的是读取前一千行,然后从文件中删除它们,以便我的脚本总是读取前一千行。是否有一种方法可以在不将其余部分读入内存的情况下实现这一点。其他解决方案包括将每一行读入数组中,然后去掉前X个条目,但对于一千万行,这将消耗太多内存和时间。
如果有任何解决方案或其他建议可以提高性能,将不胜感激。
SplFileObject
的seek()
方法时,文件仍然被读取直到你寻找的位置(每行都被读取然后丢弃)。这与使用fseek()
定位到字节偏移量的方式是不同的。 - salathetell()
或其他返回的字节偏移量存储在 spfileobject 中。这是一个简单的字节计数,可以快速跳过,因为 PHP 不必扫描/计算行结尾。一旦你定位到正确的位置,然后你就可以开始计算行数了。 - Marc B