簡體   English   中英

在不使用ini_set('memory_limit','-1')的情況下處理php中的大量數據;

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM