【问题标题】:Python: Package to reduce size of Floats and Ints?Python:减少浮点数和整数大小的包?
【发布时间】: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


【解决方案1】:

好吧,如果这真的是你需要的 numpy 中仅有的两件事,那么:

from numpy import float16 as NPfloat16
from numpy import asarray as NPasarray

test = [0.12345, 0.98765]
np_test = NPasarray(test, dtype=NPfloat16)

np_test

输出 =

array([ 0.12347412, 0.98779297], dtype=float16)

这会减少你的 exe 的大小吗?

【讨论】:

  • 不,很遗憾没有。我猜 pyInstaller 会将所有依赖项打包到 exe 中,很难弄清楚它需要哪些模块,哪些不需要。
  • 很遗憾,但值得一试
  • Python 并不像你想象的那么简单。使用 Numpy 并不是真正的解决方案,它实际上会增加您的内存使用量。例如:``` import sys import numpy as np sys.getsizeof(42.42) >>> 24 sys.getsizeof(np.asarray(42.42, dtype='float32')) >>> 84 sys.getsizeof(np.asarray (42.42, dtype='float16')) >>> 82 ```
猜你喜欢
  • 1970-01-01
  • 2018-07-09
  • 2017-07-26
  • 2017-12-17
  • 2015-03-03
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
相关资源
最近更新 更多