PHP - *fast*serialize/unserialize?

Tom*_*lak 15 php serialization

我有一个PHP脚本,它在一个相当大的CSV文件(5MB +)上构建一个二叉搜索树.这很好,但是读取/解析/索引文件大约需要3秒钟.

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

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

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

(澄清:我正在寻找的东西,需要显著比上述3秒少做反序列化的工作.)

dav*_*010 10

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 . '; ?>');
Run Code Online (Sandbox Code Playgroud)

然后在需要时包含export.php:

include 'export.php';
Run Code Online (Sandbox Code Playgroud)

根据您的Web服务器设置,您可能必须先chmodexport.php才能使其可执行.

  • 我知道这是旧的,但有更好的方法,仍然使用相同的代码.而不是使用`file_put_contents('export.php','<?php $ php_array ='.$ export.';?>');`,只需使用`file_put_contents('export.php','<?php return' .$ export.';?>');`.而不是`include'export.php';`,使用`$ data = include'export.php';`. (7认同)

Asa*_*san 6

尝试igbinary ...为我做了奇迹:

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


小智 5

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

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

因此,如果有查询,您可以知道要查找的部分。有<?php ip2long() /* and */ long2ip();执行此操作的功能。因此,0到2 ^ 32会将所有IP地址转换为5000K / 50K,总共100个较小的文件。这种方法为您带来更快的序列化。

聪明思考,代码整洁;)


zaf*_*zaf 4

看来你的问题的答案是否定的。

即使您发现“二进制序列化格式”选项,很可能会比您设想的速度慢。

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

我还想补充以下想法:

  • 缓存请求/响应
  • 你的 PHP 脚本不会关闭,而是成为一个网络服务器来回答查询
  • 或者,我敢说,更改您当前使用的数据结构和查询方法