Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 打开和读取2GB csv_Php_Csv - Fatal编程技术网

Php 打开和读取2GB csv

Php 打开和读取2GB csv,php,csv,Php,Csv,我在打开和读取2gb csv文件内容时遇到问题。每次我运行脚本时,它都会耗尽服务器内存10GB VPS云服务器,然后被杀死。我已经做了一个测试脚本,想知道是否有人可以看一下并确认我在这里没有做任何愚蠢的php操作,这会导致内存使用量看起来非常高。我已经和我的托管公司谈过了,但他们似乎认为这是一个代码问题。所以我想知道是否有人可以检查一下,确认代码中没有任何东西会导致这种问题 此外,如果您处理2GB CSV,您以前是否遇到过类似的情况 谢谢 提姆 这实际上不是一个开放的问题,而是一个处理问题 我确

我在打开和读取2gb csv文件内容时遇到问题。每次我运行脚本时,它都会耗尽服务器内存10GB VPS云服务器,然后被杀死。我已经做了一个测试脚本,想知道是否有人可以看一下并确认我在这里没有做任何愚蠢的php操作,这会导致内存使用量看起来非常高。我已经和我的托管公司谈过了,但他们似乎认为这是一个代码问题。所以我想知道是否有人可以检查一下,确认代码中没有任何东西会导致这种问题

此外,如果您处理2GB CSV,您以前是否遇到过类似的情况

谢谢

提姆


这实际上不是一个开放的问题,而是一个处理问题

我确信您不需要像当前一样将所有解析的行保留在内存中

为什么不把解析后的行放在它所属的任何地方——数据库或其他文件或任何东西


这将使您的代码一次只保留一行在内存中。

这实际上不是一个打开问题,而是处理问题

我确信您不需要像当前一样将所有解析的行保留在内存中

为什么不把解析后的行放在它所属的任何地方——数据库或其他文件或任何东西


这将使您的代码一次只保留一行在内存中。

PHP确实是错误的语言。字符串操作通常会导致在内存中分配字符串的副本,而垃圾收集只会在脚本结束时发生,此时实际上不再需要它。如果您知道如何做,并且它适合执行环境,那么最好使用perl或sed/awk


说到这里,脚本上有两个内存消耗。第一个是foreach,它复制数组。在数组_键上执行foreach,并返回数组中的字符串条目以获取行。第二个是@YourCommonSense提到的:您应该设计算法,使其在流模式下工作,即不需要在内存中存储完整的数据集。粗略地看,这似乎是可行的。

PHP确实是错误的语言。字符串操作通常会导致在内存中分配字符串的副本,而垃圾收集只会在脚本结束时发生,此时实际上不再需要它。如果您知道如何做,并且它适合执行环境,那么最好使用perl或sed/awk


说到这里,脚本上有两个内存消耗。第一个是foreach,它复制数组。在数组_键上执行foreach,并返回数组中的字符串条目以获取行。第二个是@YourCommonSense提到的:您应该设计算法,使其在流模式下工作,即不需要在内存中存储完整的数据集。粗略一看,这似乎是可行的。

正如其他人已经指出的,您正在将整个2GB文件加载到内存中。在创建一个每行包含多个字符串的数组时执行此操作,因此实际上所需的结果内存大于普通文件大小

您可能希望单独处理CSV文件的每一行,理想情况下使用迭代器,例如将每一行作为键控数组返回的迭代器:

$csv = new CSVFile('../data/test.csv');

foreach ($csv as $line) {
    var_dump($line);
}
此处的示例性输出:

array(3) {
  ["Make"]=> string(5) "Chevy"
  ["Model"]=> string(4) "1500"
  ["Note"]=> string(6) "loaded"
}
array(3) {
  ["Make"]=> string(5) "Chevy"
  ["Model"]=> string(4) "2500"
  ["Note"]=> string(0) ""
}
array(3) {
  ["Make"]=> string(5) "Chevy"
  ["Model"]=> string(0) ""
  ["Note"]=> string(6) "loaded"
}
此迭代器的灵感来自PHP中内置的名为SPLFileObject的迭代器。因为这是一个迭代器,所以您可以决定如何处理每一行的数据。见相关问题:


正如其他人已经指出的,您正在将整个2GB文件加载到内存中。在创建一个每行包含多个字符串的数组时执行此操作,因此实际上所需的结果内存大于普通文件大小

您可能希望单独处理CSV文件的每一行,理想情况下使用迭代器,例如将每一行作为键控数组返回的迭代器:

$csv = new CSVFile('../data/test.csv');

foreach ($csv as $line) {
    var_dump($line);
}
此处的示例性输出:

array(3) {
  ["Make"]=> string(5) "Chevy"
  ["Model"]=> string(4) "1500"
  ["Note"]=> string(6) "loaded"
}
array(3) {
  ["Make"]=> string(5) "Chevy"
  ["Model"]=> string(4) "2500"
  ["Note"]=> string(0) ""
}
array(3) {
  ["Make"]=> string(5) "Chevy"
  ["Model"]=> string(0) ""
  ["Note"]=> string(6) "loaded"
}
此迭代器的灵感来自PHP中内置的名为SPLFileObject的迭代器。因为这是一个迭代器,所以您可以决定如何处理每一行的数据。见相关问题: