在运行数千条记录时,PHP内存耗尽

Jam*_*ore 4 php memory

我在一组5,000个结果中运行以下代码.由于内存耗尽,它失败了.

foreach ($data as $key => $report) {
  $data[$key]['data'] = unserialize($report['serialized_values']);
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以提高内存限制,但我想在没有问题的情况下运行它.我不会永远保持记忆.


编辑

采用$data以下格式:

[1] => Array
    (
        [0] => 127654619178790249
        [report_id] => 127654619178790249
        [1] => 1
        [user_id] => 1
        [2] => 2010-12-31 19:43:24
        [sent_on] => 2010-12-31 19:43:24
        [3] => 
        [fax_trans_id] => 
        [4] => 1234567890
        [fax_to_nums] => 1234567890
        [5] => ' long html string here',
        [html_content] => 'long html string here',
        [6] => 'serialization_string_here',
        [serialized_values] => 'serialization_string_here',
        [7] => 70
        [id] => 70
    )
Run Code Online (Sandbox Code Playgroud)

Ala*_*orm 10

除了for和foreach的问题之外,您还需要重新构建解决方案.您正在达到内存限制,因为您合法地使用了太多内存.每次反序列化数据库列的内容并将其存储在数组中

$data[$key]['data']
Run Code Online (Sandbox Code Playgroud)

PHP需要留出一大块内存来存储数据,以便以后可以访问.当你的阵列太大时,你就会失去记忆力.用简单的英语,你讲的是PHP

获取所有5000行数据并将其存储在内存中,稍后我将对它们做些什么.

您需要考虑一种不同的方法来解决您的问题.以下项目是对这个问题的两个快速思考.

您无法将项目存储在内存中,只需在循环中执行您想要的任何操作,允许php根据需要丢弃项目

foreach ($data as $key => $report) {
    $object = unserialize($report['serialized_values']);        
    //do stuff with $object here
}
Run Code Online (Sandbox Code Playgroud)

您也可以只存储未序列化对象所需的信息,而不是存储整个对象

foreach ($data as $key => $report) {
    $object             = unserialize($report['serialized_values']);        
    $data               = array();
    $data['foo']        = $object->foo;
    $data[$key]['data'] = $data;
}
Run Code Online (Sandbox Code Playgroud)

长话短说:因为你实际上使用了太多的内存,所以你达到了内存限制.这里没有神奇的解决方案.存储序列化数据并尝试将其全部加载到单个程序中是一种内存密集型方法,无论语言/平台如何.