con*_*lee 23 python serialization pickle
我花了一个多小时来使用cPickle读取1 GB的NetworkX图形数据结构(当它作为二进制pickle文件存储在磁盘上时,它的1 GB).
请注意,该文件会快速加载到内存中.换句话说,如果我跑:
import cPickle as pickle
f = open("bigNetworkXGraph.pickle","rb")
binary_data = f.read() # This part doesn't take long
graph = pickle.loads(binary_data) # This takes ages
Run Code Online (Sandbox Code Playgroud)
如何加快上次操作?
请注意,我尝试使用二进制协议(1和2)来腌制数据,并且我使用的协议似乎没有太大区别.另请注意,虽然我使用上面的"装载"(意思是"加载字符串")函数,但它正在加载二进制数据,而不是ascii-data.
我正在使用的系统上有128GB的RAM,所以我希望有人会告诉我如何增加一些隐藏在pickle实现中的读缓冲区.
Tej*_*hah 10
我在使用cPickle本身读取~750 MB igraph数据结构(二进制pickle文件)方面取得了巨大成功.这是通过简单地结束这里提到的pickle加载调用来实现的
您的案例中的示例代码段将类似于:
import cPickle as pickle
import gc
f = open("bigNetworkXGraph.pickle", "rb")
# disable garbage collector
gc.disable()
graph = pickle.load(f)
# enable garbage collector again
gc.enable()
f.close()
Run Code Online (Sandbox Code Playgroud)
这绝对不是最合适的方式,但是,它大大减少了所需的时间.
(对我来说,它从843.04s减少到41.28s,大约20x)
您可能受到Python对象创建/分配开销的约束,而不是自己的unpickling.如果是这样的话,除了没有创建所有对象之外,你几乎无法加快速度.你一次需要整个结构吗?如果没有,您可以使用数据结构的延迟填充(例如:通过pickle字符串表示结构的一部分,然后仅在访问它们时取消选择它们).
| 归档时间: |
|
| 查看次数: |
11927 次 |
| 最近记录: |