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,使其可执行。
file_put_contents('export.php', '<?php $php_array = ' . $export . '; ?>');
,而是改为使用file_put_contents('export.php', '<?php return ' . $export . '; ?>');
。而且,不要再使用include 'export.php';
,而是使用$data = include 'export.php';
。 - Ismael Miguel首先,您需要改变程序的工作方式。将CSV文件分成更小的块。我假设这是一个IP数据存储。
将所有IP地址转换为整数或长整数。
因此,如果有查询,您就可以知道要查找哪一部分。有 <?php ip2long() /* and */ long2ip();
函数可以完成此操作。因此,从0到2^32,将所有IP地址转换为5000K/50K共100个较小的文件。这种方法可以使序列化更快。
聪明思考,代码整洁 ;)
你的问题的答案似乎是否定的。
即使你发现了一个“二进制序列化格式”的选项,很可能对于你所设想的速度仍然太慢。
因此,你可能需要考虑使用(如其他人所提到的)数据库、memcached或在线网络服务。
我还想补充以下几点想法:
我在这里看到两个选项
字符串序列化,最简单的形式是像这样的东西
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);
将两个选项进行基准测试并比较结果会很有趣。
pack()
该根节点,是否足以打包整个图形? - Tomalak如果你想要速度,直接读写文件系统并不是最优的选择。
在大多数情况下,数据库服务器能够比 PHP 脚本更高效地存储和检索数据。
另一个可能的选择是像 Memcached 这样的东西。
对象序列化并不以其性能而闻名,而是以其易用性,它绝对不适合处理大量的数据。
使用类似JSON的格式来存储/加载数据怎么样?我不知道PHP中JSON解析器的速度有多快,但在大多数语言中,它通常是一个快速操作,并且它是一种轻量级格式。
parent
引用会使对象图成为循环的,即能够到达之前曾经到达过的某个地方。嗯...你可以有一个 sibling
引用,它仍然是非循环的,使我之前的陈述是错误的。 - Daniel BeardsleySQLite自带PHP,您可以将其用作数据库。否则,您可以尝试使用会话,这样您就不必序列化任何内容,只需保存原始的PHP对象即可。
$value
(浮点数),一个$payload
(字符串)以及$left
和$right
节点引用。没有什么花哨的东西,但它包含了超过 100,000 个这样的对象。 - Tomalak