Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
存储大型PHP数组、普通PHP或gzip序列化数据?_Php_Arrays_Performance_Serialization_Multidimensional Array - Fatal编程技术网

存储大型PHP数组、普通PHP或gzip序列化数据?

存储大型PHP数组、普通PHP或gzip序列化数据?,php,arrays,performance,serialization,multidimensional-array,Php,Arrays,Performance,Serialization,Multidimensional Array,我有一个静态的大数组,它代表树结构,大约有100k个节点,这个数组是值锁定的只读参考 现在,这两种方法中的哪一种会表现得更好 首先,只需在纯PHP文件中定义数组,以便在请求中包含 其次,序列化这个数组,gzip序列化输出,加载gzip文件并对每个请求取消序列化 或者将数组转换为SQLite或类似的东西,但存储必须能够快速锁定长“ID路径”,即1->5556->123->45->455->Node_name(实际上PHP表做得很好) 服务器上的内存限制不是问题无论如何,您需要在某个时间点将数组转换

我有一个静态的大数组,它代表树结构,大约有100k个节点,这个数组是值锁定的只读参考

现在,这两种方法中的哪一种会表现得更好

首先,只需在纯PHP文件中定义数组,以便在请求中包含

其次,序列化这个数组,gzip序列化输出,加载gzip文件并对每个请求取消序列化

或者将数组转换为SQLite或类似的东西,但存储必须能够快速锁定长“ID路径”,即1->5556->123->45->455->Node_name(实际上PHP表做得很好)


服务器上的内存限制不是问题

无论如何,您需要在某个时间点将数组转换为PHP值,因此gzip已过时

因此,如果您要决定是使用sqlite之类的工具将其保存在磁盘上,还是让php每次都加载它(最好启用APC),那么真正的问题是内存还是CPU对您更重要。如果你还不知道,你可能正遭受着过早优化的痛苦

当减少内存或cpu(或io)与您相关时,答案将更加明显,因此确保您可以轻松地重构

如果你想预测什么对你更有利,做一个基准测试


更新我刚才看到内存显然不是问题。转到PHP数组并包含该文件。容易的。请记住,如果总数据大小为10MB,则每个apache进程的数据大小将为10MB。在100个apache进程中,这已经是1GB了。

我的基准测试告诉我们一切:

纯PHP文件大小:~5 MB

Pure PHP file import: avg load time: ~210 ms
Pure PHP file import with APC: avg: ~60-80 ms
Unserialize(gzuncompress(file_get_contents()) : almost const, every request: ~ 40 ms
由于缺乏时间,我还没有测试SQlite,以便将此树结构移植到SQL DB中


~host位于4核Intel Xeon with HT和硬件RAID 5上,考虑到每次请求都要加载整个文件,这些加载时间实际上看起来相当不错。gzip可能会有所帮助(通过减少从磁盘读取的数据量)

如果您想要更快,或者如果该文件可能变得更大,也许考虑在不加载整个文件的情况下提取您想要的方法-指向树节点/ FSETS/哈希表等的指针


如果你能找到一种方法来查找你真正想要的数据,只需加载它,而不是加载整个文件,这样会大大加快速度。

只需对其进行基准测试并告诉我们。将MycCurp视为一个额外的选项。如果内存不是一个问题,为什么要GZIP呢?这只会占用更多的处理时间。Memcached、apc,如果普通文件不再存在,则从内存中读取它(服务器重新启动等)。因为gzip将产生非常小的文件大小(因为序列化文本具有非常好的压缩比),这将缩短磁盘读取操作,如果文件被大量访问,在正常情况下,它已经被缓存在内存中,从而避免了对磁盘IO的需要。