我们已经有了一个基于Python的web服务器,它在启动时使用cPickle
取消了许多大数据文件。数据文件(使用HIGHEST_PROTOCOL
进行腌制)在磁盘上大约为0.4 GB,并以大约1.2 GB的Python对象的形式加载到内存中 - 大约需要20秒。我们在64位Windows机器上使用Python 2.6。如何将1GB的对象反序列化为比cPickle更快的Python对象?
瓶颈肯定不是磁盘(只需不到0.5秒,以实际读取这么多数据),但内存分配和对象的创建(有几百万个对象被创建)。我们希望减少20秒以减少启动时间。
有什么办法来反序列化超过对象成Python的1GB比cPickle
快得多(如5到10倍)?因为执行时间受内存分配和对象创建的约束,所以我认为使用另一个不带钩子的技术,如JSON在这里没有帮助。
我知道有些解释的语言有一种方法来他们的整个存储器图像保存为一个磁盘文件,这样他们就可以加载它放回内存中的所有一气呵成,而无需为每个对象分配/创建。有没有办法在Python中做到这一点,或实现类似的东西?
这可能是您获得固态硬盘的机会。这是为了加快开发?为了让你做快速部署? 阅读数据或取消数据的滞后性?如果你从一个空实例开始,启动时间是多少? – Scott 2010-11-16 14:59:53
请注意,我在我的问题中提到的瓶颈不是驱动器/读取速度,而是取消打开和对象创建速度。对于快速部署来说更重要 - 让我们的服务器能够快速重启。我不太确定这里的“空实例”是什么意思。 – 2010-11-16 15:08:28
对于一个750MB的pickle二进制文件,使用gc.disable()/ gc.enable()封装cPickle加载调用,大幅缩短了所需的总时间20倍左右。见[这里](http://stackoverflow.com/a/36699998/2385420) – 2016-04-18 17:42:03