我有一堆看起来像这样的文本文件:
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
行文件中的操作?
答案 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