【发布时间】:2018-01-31 12:27:09
【问题描述】:
我有一个大约 550MB 的 pickle 文件,其中包含一个带有几个子字典、浮点数和整数列表的巨大字典;加载后所需的 RAM 约为 2.5GB。
浮点数列表所需的精度最多为 10 位,因此 Numpy float16 就足够了。当我将列表从本机 Python 64 位浮点数转换为 Float16 时,我节省了大量 RAM - 但不幸的是,我想将我的工具作为 exe 分发,因此使用 PyInstaller 捆绑它 -> 但是将 numpy 与它捆绑会使 .exe 变得巨大,它的大小约为 130MB。我不需要 Numpy 提供的任何其他内容,只想使用 numpy 数据类型存储所有 Ints 和浮点数列表,因此使用 np.asarray()。
关于如何绕过它的任何想法?
我在想是否有一个 small 模块可以使用 numpy 实现简化的数据类型(如 Float16),我希望捆绑此模块只需要少量 RAM。 p>
你知道这样的事吗?
提前致谢!
【问题讨论】:
-
如果它是一个可以被 JSON 序列化的对象,JSON 对象通常比 pickle 更紧凑(但如前所述,您会失去一些灵活性)。
-
float16 的精度是 10 位,而不是 10 位。
-
也许我的帖子有点误导,磁盘上的存储大小不是问题 - 问题是我的 RAM 中字典的大小。我想减少所需的 RAM 量。也许我应该考虑另一种数据结构,嗯。 @Klaus D.:谢谢,是的
-
@tim,可能的解决方案是核外处理,因此 RAM 不是限制因素。虽然您的数据当前存储在字典中,但您可能需要重构以将数据放在一个大数组中。在这种情况下,HDF5 是一个非常好的选择,并且得到了 python(h5py 和 pyTables 库)的良好支持。
标签: python numpy pyinstaller