我有一些熊猫数据框,我可以使用.to_pickle()
保存到磁盘。这样的对象是200k-700k。Python Pickle占用多少内存?
我从memcache.py in the Python-memcache github project看到,它在缓存之前先腌制对象并压缩它们。
默认情况下,memcached只允许值高达1MB。我发现试图缓存我的200k数据框可以正常工作,但是60万个不会在Python memcache级别设置(客户端甚至不会发出set命令,除非我在memcached上使用-I
,并相应地为我的Python设置memcache.SERVER_MAX_VALUE_LENGTH
客户)。
将大约100个这样的数据帧存储到memcache中,-I 5m
允许它们全部适合,并且在写入pickle文件的磁盘上占用36MB(36212字节)。每memcached的stats
命令,我看到几乎3倍的字节都被写入,
STAT bytes_read 89917017
STAT bytes_written 89917211
...
STAT bytes 53022739
它是那么奇怪的是只有53MB的存储,如果89MB写。
如果我改变我的memcaching代码,以酸洗DataFrames 第一(即写入与.to_pickle()
一个临时文件,读取临时文件存储到内存缓存),我看到每个内存缓存stats
数据大小匹配什么是磁盘上时,我店相同的文件。
STAT bytes_read 36892901
STAT bytes_written 36893095
...
STAT bytes 36896667
用于存储酸洗对象的内存与其在磁盘上的大小相比的比例是多少?为什么python memcache不能像使用.to_pickle()
一样将DataFrames转换为更小的pickle大小呢?
Pickle可能不是存储DataFrame的最佳选择。为什么不把它们存储为CSV或其他更广泛使用的格式? – BrenBarn
我花了一些时间探索。我会在下面回答我自己的问题。以CSV格式存储(奇怪)几乎与二进制酸洗一样小。 – hamx0r
您对导出格式有什么目标/要求?如果你希望它很小,你最好使用像msgpack这样的格式。根据你的自我回答,目前还不清楚你为什么使用泡菜。 – BrenBarn