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

标签 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 行的操作?

最佳答案

检查是否内置MySQL LOAD DATA INFILE该声明不适合您。

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

关于php - 在 PHP 中处理大量非常大的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19899062/

相关文章:

php - FOREACH 和 UPDATE mysql 不能一起工作

php - 拉维尔 : advanced search form query

MySql递归逻辑

arrays - 使用 mongoose 在不同的对象数组中查找对象

php - 将值传递到灯箱

php - 将字符串转换为 int php

php - mysql_fetch_array 中的无效 MySQL 参数

mysql - JPA 如何将 ElementCollection 表的列类型设置为 BLOB

javascript - JavaScript 和正则表达式的日期解析问题

java - 使用字节指针使用 JNA 写入响应