使用PHP中的大量非常大的文件

时间:2013-11-11 04:52:29

标签: php mysql arrays large-files

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

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行文件中的操作?

3 个答案:

答案 0 :(得分:0)

检查MySQL内置LOAD DATA INFILE语句是否适合您。

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

答案 1 :(得分:0)

我同意sectus,做LOAD DATA INFILE,让MySQL做脏事。

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

如果您决定使用php方法,则应逐行阅读using fgets,然后将每个行块扔到另一个要处理的线程中。这样你就不会吃掉你允许的记忆,而且应该在更短的时间内完成工作。

答案 2 :(得分:0)

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