从文件PHP中删除前X行

Eri*_*rom 7 php performance fgets large-files splfileobject

我想知道是否有人知道如何在PHP中完成这项工作.我正在运行一个脚本,涉及打开一个文件,占用前1000行,用这些行做一些东西,然后php文件打开另一个自己的实例来接下一千行,依此类推,直到它到达文件的末尾.我正在使用splfileobject,以便我可以寻找某条线,这使我可以很好地将其分解为1000行块.我遇到的最大问题是性能问题.我正在处理拥有超过10,000,000行的文件,虽然它在前10,000行左右的速度非常快,但在此之后有一个巨大的指数减速,我认为只需要寻求这一点.

我想要做的是读取前几千行,然后从文件中删除它们,以便我的脚本始终读取前几千行.有没有办法在不将文件的其余部分读入内存的情况下执行此操作.我见过的其他解决方案涉及将每一行读入一个数组,然后摆脱前X个条目,但有一千万行会耗费太多的内存和时间.

如果有人有解决方案或其他建议可以加快性能,那将非常感激.

Tab*_*med 1

不幸的是,没有真正的解决方案,因为文件在读取之前总是完全加载到主内存中。

尽管如此,我还是发布了这个答案,因为这是一个可能的解决方案,但我怀疑它很难提高性能。如果我错了请纠正我。

您可以使用 XML 将文件划分为 1000 行单元。并使用 PHP 的 DomDocument 类来检索和追加数据。当您想要添加数据并检索第一个子级以获取前一千行时,您可以附加子级,并根据需要删除该节点。像这样 :

<document>
    <part>
        . . . 
        Thousand lines here
        . . . 
    </part>
    <part>
        . . . 
        Thousand lines here
        . . . 
    </part>
    <part>
        . . . 
        Thousand lines here
        . . . 
    </part>
    .
    .
    .
</document>
Run Code Online (Sandbox Code Playgroud)

其他方式 :

如果您确实确定将这些部分分成正好 1000 行,为什么不将其保存在数据库中,每 1000 行位于不同的行中?通过这样做,您肯定会减少文件读/写开销并提高性能。