在PHP中管理大型数组

4

我正在为某人挖掘数百万条旧日志记录的数据,并希望在这个过程中使用PHP来呈现材料,并将它们轻松地链接到现有的PHP系统。

我在终端(OSX 10.8)中运行了以下代码:

// Settings
ini_set('error_reporting', E_ALL); // Shows all feedback from the parser for debugging
ini_set('max_execution_time', 0); // Changes the 30 seconds parser exit to infinite
ini_set('memory_limit', '512M'); // Sets the memory that may be used to 512MegaBytes


echo 'Start memory usage: '.(memory_get_usage(TRUE) / 1024)."\n";

$x = Array();
for ($i = 0; $i < 1e7; $i++) {
    $x[$i] = 1 * rand(0, 10);
    //unset($x[$i]);
}

echo 'End memory usage: '.(memory_get_usage(TRUE) / 1024)."\n";
echo 'Peak memory usage: '.(memory_get_peak_usage(TRUE) / 1024)."\n";

这是一个简单的测试,包含一千万次循环。与Python中使用字典相比,泄漏情况真的很糟糕 :(。

当我取消注释unset()函数以测试使用情况时,它会立即变得美好,就像所有的独角兽和彩虹一样。因此,强制释放内存似乎进行得很好。

是否有任何方法可以在512M内存限制内仍然维护10-50个百万个数组条目?

我想象不出我何时会使用这些类型的循环进行正则表达式匹配..


1
如果你所说的日志条目是文件,那么请停下来阅读grep/zgrep页面。 - user180100
1
“有没有办法在512M内存限制内仍然维护10-50百万个数组条目?”是的,我们称之为数据库。 - Waleed Khan
您是否真的需要一次将所有X百万行保存在数组中?您是存储每一个数据位,还是只存储实际需要的数据?同时,对@WaleedKhan的评论点赞。 - Sammitch
2个回答

3

使用 SplFixedArray,因为您确实需要查看PHP数组(和值)的真正大小?(提示:很大!)

$t = 1e6;
$x = array();
for($i = 0; $i < $t; $i ++) {
    $x[$i] = 1 * rand(0, 10);
}

输出

Start memory usage: 256
End memory usage: 82688
Peak memory usage: 82688

并且。
$t = 1e6;
$x = new SplFixedArray($t);
for($i = 0; $i < $t; $i ++) {
    $x[$i] = 1 * rand(0, 10);
}

输出
Start memory usage: 256
End memory usage: 35584
Peak memory usage: 35584

但更好的选择是考虑使用像REDIS这样的基于内存的数据库。


当使用100万个项目运行时,我得到了一个峰值内存为86,784KB的SplFixedArray使用情况。 - Alister Bulman
我用这种方法只能达到大约590万个周期。我想这可能是 PHP 优化的极限了吧? :) - user1467267
我认为这是解决问题的可行替代方案。我决定从PHP中运行shell,通过Python处理数据并将其传回到PHP。我已经获得了大量内存,并且似乎比纯PHP更快。 - user1467267
好主意,但我仍在运行一些测试...如果有任何进展,我会更新您。 - Baba
@Allendar,我认为我找到了一个更好的解决方案 https://github.com/ircmaxell/php-ndata#benchmarks - Baba

0
如果SplFixedArray对您不起作用,我强烈推荐使用RabbitMQ -> http://www.rabbitmq.com/tutorials/tutorial-one-php.html RabbitMQ比人们通常想象的更简单易用,并且它有一个很好的PHP库。
使用RabbitMQ,您的脚本可以快十倍、二十倍、一百倍(取决于您设置的消费者数量),您还可以管理任意数量的数据。
我曾经使用RabbitMQ导入数百万行数据,以检索有关在丹麦注册的所有汽车的信息,想象一下这有多大。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接