PHP数组内存使用情况

PHP数组内存使用情况,php,arrays,memory,tab-delimited,Php,Arrays,Memory,Tab Delimited,我有一个制表符分隔的文件,我需要在数组中(这样我可以在其中查找值)。我原以为我可以遍历这些行,然后将分解后的值推到一个数组中,如下所示: 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

我有一个制表符分隔的文件,我需要在数组中(这样我可以在其中查找值)。我原以为我可以遍历这些行,然后将分解后的值推到一个数组中,如下所示:

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);
错误报告(E_ALL);
ini_设置(“内存限制”,“20M”);
$holder=数组();
$csv=array();
$lines=file('Path\\To\\file\\2014\u 04\u 05\u 08\u 48.txt');

对于($a=0;$a),数组中的每个元素都是一个可能有48字节开销的变量,而holder中的每个元素本身就是一个有76字节开销的数组

因此,每行170个字段的开销为170x48=8160字节;而11000行的开销为89760000字节,如果将其全部加载到内存中,而不是加载到10行的块中。那么每行是一个数组,其开销为76字节(11000x76=836000字节)再加上holder数组的76个字节……这甚至不包括字段中数据的实际大小

编辑

您仅从CSV行中的10个字段构建$holder;但这仍然相当于5280000字节(加上每个元素中的数据)的10x11000x48开销,再加上11000x76=836000字节,再加上78字节的$holder数组,总计6116078字节(约6MB)…将整个$file加载到内存中所需的6MB内存只剩下20MB的8MB


再加上PHP本身占用内存,加上脚本的代码,再加上脚本中的其他变量,很快就会接近20MB的限制,数组中的每个元素都是一个可能有48字节开销的变量,holder中的每个元素都是一个有76字节开销的数组本身

因此,每行170个字段的开销为170x48=8160字节;而11000行的开销为89760000字节,如果将其全部加载到内存中,而不是加载到10行的块中。那么每行是一个数组,其开销为76字节(11000x76=836000字节)再加上holder数组的76个字节……这甚至不包括字段中数据的实际大小

编辑

您仅从CSV行中的10个字段构建$holder;但这仍然相当于5280000字节(加上每个元素中的数据)的10x11000x48开销,再加上11000x76=836000字节,再加上78字节的$holder数组,总计6116078字节(约6MB)…将整个$file加载到内存中所需的6MB内存只剩下20MB的8MB


再加上PHP本身占用内存,加上脚本的代码,再加上脚本中的其他变量,您很快就接近了20MB的限制

点#1-了解fgetcsv()对于加载CSV文件,我首先尝试了同样的问题,即内存不足。这会影响阵列使用的内存吗?这不会影响内存使用,但更容易编码……但使用$line会带来很大的不同,因为您正在将文件的整个内容加载到内存中,而在加载之前需要使用6MB的内存开始循环。虽然$holder是大内存占用者,但最初的6MB永远不会释放,因此如果使用fgetcsv()进行编码,它仍然是20MB限制中相当大的一部分相反,您一次只从文件中加载一行,而不是全部11000行;因此,虽然它不会减少$holder的大小,但它确实消除了$linesNote占用的大部分6MB内存,特别是对于PHP脚本来说,20MB并不是那么大的限制;PHP.ini中的标准默认内存配置是32MBPoint#1-了解fgetcsv()对于加载CSV文件,我首先尝试了同样的问题,即内存不足。这会影响阵列使用的内存吗?这不会影响内存使用,但更容易编码……但使用$line会带来很大的不同,因为您正在将文件的整个内容加载到内存中,而在加载之前需要使用6MB的内存开始循环。虽然$holder是大内存占用者,但最初的6MB永远不会释放,因此如果使用fgetcsv()进行编码,它仍然是20MB限制中相当大的一部分相反,一次只从文件中加载一行,而不是全部11000行;因此,虽然它不会减少$holder的大小,但它确实消除了$linesNote占用的大部分6MB内存,特别是对于PHP脚本来说,20MB并不是那么大的限制;PHP.ini中的标准默认内存配置是基于32位PHP的32MB数字……有关详细信息,请参阅关于数学,以及基于32位PHP的64位PHP图形的等价物……有关数学的详细信息,以及64位PHP的等价物,请参阅