[英]Handling large amounts of data in php without using ini_set('memory_limit', '-1');
我正在尝试使用PHP进行情感分类,我有一个包含1020386记录的bigrams文件,当我加载该文件就可以了,当我对其执行操作时,我得到了134217728字节已用完的允许内存大小 ,我试图执行一次对1000条记录的操作,但仍然是相同的问题,我正在使用codeigniter和文件帮助程序类。
$reader = new FilePrep();
$content = $reader->read(base_url().'Assets/files/w2_.txt');
$delimited = explode(PHP_EOL, $content);
$ngrams = array();
for($from = 0; $to = sizeof($delimited) ; $from+=1000){
$new = array_slice($ngrams, $from, 1000);
foreach($new as $ngram){
$del = explode(' ', $ngram);
array_push($ngrams, array($del[0],$del[1].' '.$del[2]));
}
}
print_r($ngrams);
FilePrep.php
public function read($path){
$handle = fopen($path,'r');
$string = stream_get_contents($handle);
return $string;
}
提前致谢
我没有意识到代码中的某些问题。 您的for出了点问题。 没有退出,因此PHP无法停止工作,并且您遇到内存错误。 第二件事是您尝试将整个文件加载到变量中,然后将其划分为int数组。 更好的方法是逐行读取文件,然后分配数据。 最后一件事是您无法将100万行分配给二维数组变量。 每次您为PHP进行array_push时,内存都会减少约650位(基于您的w2_.txt文件示例)。
请查看给定的代码。 当您向数组添加数据时,可以看到PHP如何使用内存:
$handle = fopen('w2_.txt', 'r');
$ngrams = array();
$i=0;
echo $i . ': ' . memory_get_usage() . "\t";
$current_memory_usage = memory_get_usage();
while (($line = fgets($handle, 8192)) !== false) {
$i++;
echo "File line # $i \t";
$del = explode("\t", $line);
array_push($ngrams, array($del[0],$del[1].' '.$del[2]));
echo "[ rised: " . (memory_get_usage() - $current_memory_usage) . "\t total: " . memory_get_usage() . "]\n";
$current_memory_usage = memory_get_usage();
}
fclose($handle);
给出输出:
FILE MEMORY RISED TOTAL MEMORY USED
File line # 1 [ rised: 9984 total: 254248]
File line # 2 [ rised: 616 total: 254864]
File line # 3 [ rised: 648 total: 255512]
File line # 4 [ rised: 632 total: 256144]
File line # 5 [ rised: 640 total: 256784]
File line # 6 [ rised: 640 total: 257424]
File line # 7 [ rised: 640 total: 258064]
File line # 8 [ rised: 640 total: 258704]
File line # 9 [ rised: 704 total: 259408]
File line # 10 [ rised: 656 total: 260064]
File line # 11 [ rised: 624 total: 260688]
File line # 12 [ rised: 640 total: 261328]
File line # 13 [ rised: 640 total: 261968]
File line # 14 [ rised: 640 total: 262608]
File line # 15 [ rised: 640 total: 263248]
File line # 16 [ rised: 640 total: 263888]
File line # 17 [ rised: 768 total: 264656]
File line # 18 [ rised: 640 total: 265296]
File line # 19 [ rised: 640 total: 265936]
File line # 20 [ rised: 640 total: 266576]
File line # 21 [ rised: 640 total: 267216]
File line # 22 [ rised: 640 total: 267856]
...
不确定会有什么帮助。
1)尝试更换:
foreach($new as $ngram)
与
foreach($new as &$ngram)
Foreach在变量副本上进行迭代。 如果将其设置为参考“&ngram”,则可以通过对同一变量进行操作来节省内存。
2)如果没有使用过的变量-将其清除。
$del = null
3)您可以添加到源代码中:
echo memory_get_usage() . "\n";
因此您可以查看内存消耗过多的地方。
祝好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.