如何在PHP中序列化和反序列化大文件?

时间:2017-06-26 15:19:56

标签: php file caching trie

我有一个巨大的复杂数据结构(TRIE),我需要存储以供以后使用。

所以,我使用序列化/反序列化(请提出任何更好的方法):

$fp = fopen("serialized_trie.txt","w+");
fwrite($fp,serialize($root));
fclose($fp);

$root = unserialize(file_get_contents("serialized_trie.txt"));

trie本身由100万字组成。所以这是一个很大的特里。

我需要以某种方式存储这个特里。将这样一个大的trie写入文件需要花费大量的时间。反序列化中的file_get_contents会导致整个文件被加载到内存中。

我是否需要使用二进制文件而不是txt文件?怎么样?

此外,我还阅读了有关存储的3种技术: 连载, json_encode, var_export

在这种情况下我是否需要使用json_encode或var_export方法?

如何快速存储特里并检索它?

1 个答案:

答案 0 :(得分:1)

您没有指定实际文件大小。话虽如此,序列化函数基本上将变量转换为可以安全地写入磁盘的中间文本形式,但它根本没有优化。

您可以尝试在文件编写之前压缩文件:

$fp = fopen("serialized_trie.gzd","w+");
//gzdeflate supports 0-9 levels of compression
//You might want to experiment
fwrite($fp, gzdeflate(serialize($root), 5));
fclose($fp);

阅读:

$root = unserialize(gzinflate(file_get_contents("serialized_trie.gzd")));

扩展名并不重要,因为原始deflate文件没有标准,但我建议使用除.txt以外的其他内容来表明这不是实际的文本文件。

关于内存使用,这在很大程度上取决于您已经指出的trie结构的大小,但是没有任何细节。

作为per my answer to your other question,这比从内存缓存中读取变量慢很多倍。

Serialize用于序列化一个或多个php变量并从磁盘重新读取这些变量。它用于php会话支持。

<强> JSON

如果需要返回数据以便在需要或支持javascript兼容变量的客户端中使用,则json_encode非常有用。

<强> var_export

var_export在复杂数据结构方面存在一些问题。话虽如此,可以使用var_export将trie结构写为php脚本,然后可以是require_once()。这可能比其他选项更有效。

$fp = fopen("trie.php","w+");
fwrite($fp, '<?php $root = ' . var_export($root) . '; ?>');
fclose($fp);

回读:

require_once('trie.php');

显然,您的脚本需要将trie.php放在可读/写的webroot下的某个位置,但这是另一个讨论。像任何其他include()一样,您需要脚本的路径。