我想知道是否有人知道如何在PHP中完成这项工作。我正在运行一个脚本,涉及打开一个文件,占用前1000行,用这些行做一些东西,然后php文件打开另一个自己的实例来接下一千行,依此类推,直到它到达文件的末尾。我正在使用splfileobject,以便我可以寻找某条线,这使我可以很好地将其分解为1000行块。我遇到的最大问题是性能问题。我正在处理拥有超过10,000,000行的文件,虽然它在前10,000行左右的速度非常快,但在此之后有一个巨大的指数减速,我认为只需要寻求这一点。
我想要做的是阅读前几千行,然后从文件中删除它们,以便我的脚本始终读取前几千行。有没有办法在不将文件的其余部分读入内存的情况下执行此操作。我见过的其他解决方案包括将每一行读入一个数组然后删除前X个条目,但是有一千万行会占用太多的内存和时间。
如果有人有解决方案或其他可以提高效果的建议,我们将不胜感激。
答案 0 :(得分:1)
不幸的是,没有真正的解决方案,因为文件总是在读取之前完全加载到主内存。
尽管如此,我已经发布了这个答案,因为这是一个可能的解决方案,但我怀疑它几乎没有提高性能。如果我错了,请纠正我。
您可以使用XML将文件分成1000行的单位。并使用PHP的DomDocument类来检索和追加数据。您可以在要添加数据时附加子项,并检索第一个子项以获取前几千行,并根据需要删除它。就像这样:
<document>
<part>
. . .
Thousand lines here
. . .
</part>
<part>
. . .
Thousand lines here
. . .
</part>
<part>
. . .
Thousand lines here
. . .
</part>
.
.
.
</document>
另一种方式:
如果你真的确定要将这些部分分成1000行,为什么不将它保存在一个数据库中,每1000行在另一行?通过这样做,您肯定会减少文件读/写开销并提高性能。
答案 1 :(得分:1)
在我看来,目标是解析大量数据并将其插入数据库?如果是这样,我不明白为什么使用1000行很重要?
我想我只是通过一次读入一大块数据(比如1 MB)到内存中来接近它,然后从内存块的末尾向后扫描以便最后一行结束。有了这个,我可以保存文件位置和我拥有的额外数据(从最后一行结束到块结尾的剩余部分)。或者,只需使用fseek()将文件指针重置为我找到最后一行结尾的文件中的位置,可以使用strlen($ chunk)轻松完成。
这样,我所要做的就是通过运行explode(“\ r \ n”,$ chunk)来爆炸这个块,并且我拥有所需的所有行,在一个适当的大块中进行进一步处理。
不建议从文件开头删除行。这将把大量数据来回移动到磁盘上。