0

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

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在不使用数组的情况下执行文件中的行之类的操作?

4

3 回答 3

0

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

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

于 2013-11-11T04:58:30.630 回答
0

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

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

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

于 2013-11-11T05:09:21.970 回答
0

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

于 2013-11-11T05:10:24.023 回答