繁体   English   中英

在PHP中处理大量非常大的文件

[英]Working with a large amount of really large files in PHP

我有一堆看起来像这样的文本文件:

987654 Example 1
321987 Test 2
654321 Whatever 1

每列代表一个特定值(例如,ID,​​时间戳,名称等)。 我正在尝试将所有这些都汇集到MySQL表中。 我需要分别阅读这些文件的每一行,并分析每一行的哪一部分应该放入该行的哪一列。

每个文件包含大约5,000,000行。 我试图用这个做一个测试:

$test = array();
for($i=1;$i<5000000;$i++){
  $test[] = '';
}

即使是一个包含这么多元素的空白数组,也会使我的内存限制最大(64mb,它也需要保持在该限制,因为我的主机不允许更大的东西),因此将文件变成数组是不可能的,并且可能有点愚蠢。回想一下。 我不在这里,因为我以前从未做过这样的事情。

如何在不使用数组的情况下执行文件中的foreach行之类的操作?

查看MySQL内置的LOAD DATA INFILE语句是否不适合您。

如果没有,则可以使用PHP SplFileObject类来遍历文件行,而无需将所有文件行都加载到内存中。 它具有解析SplFileObject::fgetcsv()行的特定方法,例如SplFileObject::fgetcsv()SplFileObject::fscanf() 在这种情况下,您可能希望使用PDO来让MySQL事务一次提交所有插入语句,以加快导入过程或在出现问题时回滚所有插入语句。

我同意sectus,执行LOAD DATA INFILE ,然后让MySQL做一些肮脏的工作。

如果您绝对需要使用php,则另一种方法是使用某种“并行处理”, 因此SO Question对此有更多信息。

如果决定使用php方法,则应使用fgets逐行阅读,然后将每一行大块丢给要处理的不同线程。 这样,您就不会吃掉允许的内存,而应该在更短的时间内完成工作。

对于此类大文件,如果文件正确分隔,则需要bigdump脚本。 它易于使用,非常有效且快速。 我用它将这样的大文件导入mysql。 大转储

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM