[英]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.