繁体   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