代码之家  ›  专栏  ›  技术社区  ›  Tomalak

php-*快速*序列化/取消序列化?

  •  13
  • Tomalak  · 技术社区  · 14 年前

    我有一个php脚本 binary search tree 结束 a rather large CSV file (5Mb+)。这一切都很好,但是读取/解析/索引文件大约需要3秒钟。

    现在我想我可以用 serialize() unserialize() 加快进程。如果csv文件在此期间没有更改,则没有必要再次对其进行解析。

    令我恐惧的是我发现 序列化() 在我的index对象上花费5秒并生成一个巨大的(19MB)文本文件,而 取消序列化() 要花27秒才能读出来。 改进 看起来有点不一样。;-)

    那么-在php中有没有一种更快的机制来将大型对象图存储/从磁盘恢复到磁盘?

    (澄清:我正在寻找 明显地 不到上述3秒完成反序列化工作。)

    8 回复  |  直到 12 年前
        1
  •  3
  •   zaf    14 年前

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

    即使您发现了一个“二进制序列化格式”选项,也很可能会减慢您的预期速度。

    因此,您可能需要使用(如其他人所述)一个数据库、memcached或在线web服务。

    我还想补充以下想法:

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

    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使其首先可执行。

        3
  •  5
  •   Asad Hasan    12 年前

    试试igbinary…给我带来了奇迹:

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

        4
  •  4
  •   Peter O. Manuel Pinto    13 年前

    首先你必须改变你的程序的工作方式。将csv文件分成更小的块。我想这是一个IP数据存储。.

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

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

    思维敏捷,代码整洁;)

        5
  •  2
  •   user187291    14 年前

    我看到两个选择

    字符串序列化,最简单的形式如下

      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);
    

    对这两个选项进行基准测试并比较结果会很有趣。

        6
  •  1
  •   selfawaresoup    14 年前

    如果你想要速度,写或读文件系统在低于最佳。

    在大多数情况下,数据库服务器能够比读取/写入文件的php脚本更有效地存储和检索数据。

    另一种可能是 Memcached .

    对象序列化并不以其性能而闻名,但由于其易用性,它绝对不适合处理大量数据。

        7
  •  0
  •   Daniel Beardsley    13 年前

    使用类似json的格式来存储/加载数据怎么样?我不知道json解析器在php中的速度有多快,但在大多数语言中,它通常是一个快速的操作,而且是一种轻量级格式。

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

        8
  •  -1
  •   Brent Baisley    14 年前

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