我有一个制表符分隔的文件,我需要在一个数组中(所以我可以在其中查找值)。我曾经以为我可以遍历这些行并将爆炸值推送到一个数组中,如下所示:
error_reporting(E_ALL);
ini_set("memory_limit","20M");
$holder = array();
$csv = array();
$lines = file('Path\\To\\File\\2014_04_05_08_48.txt');
for ($a=0; $a<count($lines); $a++) {
$csv = '';
$csv = $lines[$a];
$csv = explode("\t", $csv);
array_splice($csv, 10);
array_push($holder, $csv);
}
print_r($holder);
此文件大约是11000行,170个字段/行(来自POS系统的当前库存的输出)。该文件小于6MB。我不断收到有关超出内存限制的错误。从这里开始,我发现增加内存限制通常是一种覆盖内存泄漏/内存使用不足的方法。
我终于通过将内存限制设置为20M并在第10个值之后剥离每个数组来实现它。
我的问题是为什么我需要如此高的内存限制才能将文件内容放入数组中?超过3倍的尺寸似乎很多。我做错了吗?
答案 0 :(得分:6)
数组中的每个元素都是一个可能有48个字节开销的变量,holder中的每个元素都是一个数组本身,有76个字节的开销
因此,每行170个字段的开销为170x48 = 8160字节;并且你有11000行,如果你把它全部加载到内存而不是10行的块中,那么总计89,760,000个字节。然后每一行都是一个数组,它有76字节的开销(11000x76 = 836,000字节)加上持有者数组的另外76个字节.....并且它甚至不包括你字段中的实际数据大小
修改强>
您只能在CSV行中的10个字段中构建$ holder;但这相当于数据元素5,280,000字节(加上每个元素中的数据)的10x11000x48开销,再加上11000x76 = 836,000字节加上78字节的$ holder数组,总计6,116,078(约6MB)...... 6MB从将整个$ file加载到内存中,只留下8MB的8MB
添加PHP本身占用内存,加上脚本代码以及脚本中的其他变量,以及您快速接近20MB限制的事实