php - 从文件 PHP 中删除前 X 行

标签 php performance large-files fgets splfileobject

我想知道是否有人知道如何在 PHP 中完成此操作。我正在运行一个脚本,该脚本涉及打开一个文件,获取前 1000 行,对这些行执行一些操作,然后 php 文件打开自身的另一个实例以获取接下来的 1000 行,依此类推,直到到达文件末尾.我正在使用 splfileobject 以便我可以查找某一行,这使我可以很好地将其分解为 1000 行 block 。我遇到的最大问题是性能。我正在处理超过 10,000,000 行的文件,虽然它处理前 10,000 行左右的速度相当快,但在那之后会出现巨大的指数减速,我认为只需要寻找到那一点。

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

如果有人有解决方案或其他可以加快性能的建议,我们将不胜感激。

最佳答案

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

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

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

<document>
    <part>
        . . . 
        Thousand lines here
        . . . 
    </part>
    <part>
        . . . 
        Thousand lines here
        . . . 
    </part>
    <part>
        . . . 
        Thousand lines here
        . . . 
    </part>
    .
    .
    .
</document>

另一种方式:

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

关于php - 从文件 PHP 中删除前 X 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9877447/

相关文章:

php - MySQL:在九月和九月之间选择

performance - Lua优化内存

Python:如何将巨大的文本文件读入内存

node.js - 使用 Node.js 编写大文件

git - GitLab 是否通过 git-annex 或其他方式支持大文件?

PHP:str_replace() 中的 "... variables can be passed by reference"?

javascript - 从日期选择器按天搜索

php - 除指定字符外,所有字符均替换为 *

c++ - -march=native 有害的原因是什么

Javascript 模块声明 - 性能