我有一个PHP脚本,可以构建binary search tree而不是a rather large CSV file(5MB +)。这很好,但是读取/解析/索引文件大约需要3秒钟。
现在我想我可以使用serialize()
和unserialize()
来加快这个过程。当CSV文件在此期间没有改变时,没有必要再次解析它。
令我恐惧的是,我发现在我的索引对象上调用serialize()
需要5秒钟并生成一个巨大的(19MB)文本文件,而unserialize()
需要27秒才能读回来。 改进看起来有点不同。 ; - )
那么 - 是否有更快的机制在PHP中存储/恢复大型对象图到磁盘?
(澄清一点:我正在寻找能够显着小于上述3秒进行反序列化工作的东西。)
答案 0 :(得分:8)
var_export
应该快得多,因为PHP根本不需要处理字符串:
// export the process CSV to export.php
$php_array = read_parse_and_index_csv($csv); // takes 3 seconds
$export = var_export($php_array, true);
file_put_contents('export.php', '<?php $php_array = ' . $export . '; ?>');
然后在需要时包含export.php:
include 'export.php';
根据您的Web服务器设置,您可能需要chmod
export.php才能使其首先执行。
答案 1 :(得分:5)
尝试igbinary ...为我做了奇迹:
答案 2 :(得分:4)
首先,您必须更改程序的工作方式。将CSV文件分成较小的块。这是我假设的IP数据存储区。 。
将所有IP地址转换为整数或长整数。
因此,如果查询出现,您可以知道要查看哪个部分。
有<?php ip2long() /* and */ long2ip();
个函数可以做到这一点。
所以0到2 ^ 32将所有IP地址转换为5000K / 50K总共100个较小的文件。
这种方法为您带来了更快的序列化。
认真思考,代码整洁;)
答案 3 :(得分:3)
似乎你的问题的答案是否定的。
即使您发现了“二进制序列化格式”选项,也很可能会因为您想象的速度而放慢速度。
因此,您可能需要考虑使用(正如其他人所提到的)数据库,memcached或在线Web服务。
我还想添加以下想法:
答案 4 :(得分:2)
我在这里看到两个选项
字符串序列化,最简单的形式如
write => implode("\x01", (array) $node);
read => explode() + $node->payload = $a[0]; $node->value = $a[1] etc
使用pack()
进行二进制序列化 write => pack("fnna*", $node->value, $node->le, $node->ri, $node->payload);
read => $node = (object) unpack("fvalue/nre/nli/a*payload", $data);
对两个选项进行基准测试并比较结果会很有趣。
答案 5 :(得分:1)
如果你想要速度,写入文件系统或从文件系统读取不是最佳的。
在大多数情况下,数据库服务器将能够比读取/写入文件的PHP脚本更有效地存储和检索数据。
另一种可能性是Memcached。
对象序列化的性能并不为人所知,但它易于使用,并且绝对不适合处理大量数据。
答案 6 :(得分:0)
如何使用JSON之类的内容来存储/加载数据呢?我不知道JSON解析器在PHP中有多快,但它通常在大多数语言中都是快速操作,并且它是一种轻量级格式。
答案 7 :(得分:-1)
SQLite附带PHP,您可以将其用作数据库。否则,您可以尝试使用会话,然后您不必序列化任何内容,只需保存原始PHP对象即可。