【发布时间】:2017-06-23 18:47:54
【问题描述】:
我收到以下错误:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 36 bytes)
此代码块中失败的行是while (($dataInputRecord = fgetcsv($inputFile, $maxRowLength, ",")) !== FALSE):
if (($inputFile = fopen($fileName, "r")) !== FALSE) {
while (($dataInputRecord = fgetcsv($inputFile, $maxRowLength, ",")) !== FALSE) {
// do stuff
}
fclose($inputFile);
}
整个文件为 32MB。玩弄$maxRowLength 的大小并没有帮助。我确信问题在于文件大小,因为将其截断为 8 KB 可以解决问题。我怎样才能让它不关心文件大小?
编辑:看起来我的老板误导了我关于循环中的代码应该做什么
【问题讨论】:
-
内存永远不会是无限的,因此没有适用于任何 csv 文件大小的通用解决方案。有几种解决方法,您可以从 stackoverflow.com/questions/17520093/… 开始
-
我不想将整个文件加载到内存中。应该在循环的多次迭代中持续存在的唯一变量应该是一个相对较小的满足特定条件的行数组和输入文件的句柄。
-
好吧,我敢打赌(赌注很高),实际的问题就是您在
// do stuff忽略的问题 - 我们可以看看吗?跨度> -
向memory_get_usage 添加一些调用可能会帮助您理解为什么
// do stuff占用的内存比您预期的要多。