Python:预加载内存
我有一个 python 程序,我需要在其中加载和反序列化 1GB 的 pickle 文件。这需要 20 秒,我想要一种机制,可以随时使用泡菜的内容。我看过shared_memory但它的所有使用示例似乎都涉及 numpy 而我的项目不使用 numpy。使用shared_memory或以其他方式实现这一目标的最简单和最干净的方法是什么?
这就是我现在加载数据的方式(每次运行):
def load_pickle(pickle_name):
return pickle.load(open(DATA_ROOT + pickle_name, 'rb'))
我希望能够在两次运行之间编辑模拟代码而无需重新加载泡菜。我一直在搞乱,importlib.reload但对于包含许多文件的大型 Python 程序来说,它似乎真的不太好用:
def main():
data_manager.load_data()
run_simulation()
while True:
try:
importlib.reload(simulation)
run_simulation()
except:
print(traceback.format_exc())
print('Press enter to re-run main.py, CTRL-C to exit')
sys.stdin.readline()
回答
这可能是一个XY 问题,其根源是假设您必须使用泡菜;由于它们管理依赖项的方式,它们处理起来很糟糕,并且从根本上说它们对于任何长期数据存储来说都是一个糟糕的选择,因为它
源财务数据几乎可以肯定以某种表格形式开始,因此可以以更友好的格式请求它
一个简单的中间件同时反序列化和重新序列化泡菜将平滑过渡
input -> load pickle -> write -> output
将您的工作流程转换为使用 Parquet 或 Feather 来提高读写效率,这几乎肯定会对您的加载速度产生相当大的影响
更多相关链接
- 对如何可逆地将 Pandas 数据帧存储到磁盘和从磁盘加载它的回答
- 与其他格式相比,镶木地板格式的优缺点是什么?
您也可以使用hickle来实现这一点,它将在内部使用 HDH5 格式,理想情况下使其比 pickle 快得多,同时仍然表现得像一个
回答
将 unpickle 数据存储在内存中的另一种方法是将 pickle 存储在 ramdisk 中,只要大部分时间开销来自磁盘读取。示例代码(在终端中运行)如下。
sudo mkdir mnt/pickle
mount -o size=1536M -t tmpfs none /mnt/pickle
cp path/to/pickle.pkl mnt/pickle/pickle.pkl
然后您可以在 访问泡菜mnt/pickle/pickle.pkl。请注意,您可以将文件名和扩展名更改为您想要的任何内容。如果磁盘读取不是最大的瓶颈,您可能看不到速度的提高。如果内存不足,您可以尝试调低 ramdisk 的大小(我将其设置为 1536 mb 或 1.5gb)