PHP - * fast * serialize / unserialize?

时间:2010-03-30 13:20:10

标签: php serialization

我有一个PHP脚本,可以构建binary search tree而不是a rather large CSV file(5MB +)。这很好,但是读取/解析/索引文件大约需要3秒钟。

现在我想我可以使用serialize()unserialize()来加快这个过程。当CSV文件在此期间没有改变时,没有必要再次解析它。

令我恐惧的是,我发现在我的索引对象上调用serialize()需要5秒钟并生成一个巨大的(19MB)文本文件,而unserialize()需要27秒才能读回来。 改进看起来有点不同。 ; - )

那么 - 是否有更快的机制在PHP中存储/恢复大型对象图到磁盘?

(澄清一点:我正在寻找能够显着小于上述3秒进行反序列化工作的东西。)

8 个答案:

答案 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 ...为我做了奇迹:

http://pecl.php.net/package/igbinary

答案 2 :(得分:4)

首先,您必须更改程序的工作方式。将CSV文件分成较小的块。这是我假设的IP数据存储区。 。

将所有IP地址转换为整数或长整数。

因此,如果查询出现,您可以知道要查看哪个部分。 有<?php ip2long() /* and */ long2ip();个函数可以做到这一点。 所以0到2 ^ 32将所有IP地址转换为5000K / 50K总共100个较小的文件。 这种方法为您带来了更快的序列化。

认真思考,代码整洁;)

答案 3 :(得分:3)

似乎你的问题的答案是否定的。

即使您发现了“二进制序列化格式”选项,也很可能会因为您想象的速度而放慢速度。

因此,您可能需要考虑使用(正如其他人所提到的)数据库,memcached或在线Web服务。

我还想添加以下想法:

  • 请求/响应的缓存
  • 您的PHP脚本未关闭,但成为回答查询的网络服务器
  • 或者,我敢说,改变您当前使用的数据结构和查询方法

答案 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中有多快,但它通常在大多数语言中都是快速操作,并且它是一种轻量级格式。

http://php.net/manual/en/book.json.php

答案 7 :(得分:-1)

SQLite附带PHP,您可以将其用作数据库。否则,您可以尝试使用会话,然后您不必序列化任何内容,只需保存原始PHP对象即可。