【问题标题】:Best way to store a large amount of floats in a file with Python?使用 Python 在文件中存储大量浮点数的最佳方法?
【发布时间】:2020-02-10 20:16:16
【问题描述】:

我有一个程序可以生成非常大的浮点数序列,通常大约数千万。我需要一种将它们存储在文件中的好方法。我将按顺序编写它们,并使用 Python 阅读它们。浮点数是这样的一维数组:

[39534.543, 834759435.3445643, 1.003024032, 0.032543, 434.0208...]

(这些数字是示例,我只是用键盘捣碎来制作它们。)

生成数字的代码:

for x in range(16384):
    for y in range(16384):
        float = <equation with x and y>
        <write float to file>

【问题讨论】:

  • “最佳”如何衡量?
  • 你有没有做过任何研究或尝试过什么?
  • 最方便,但仍然相当快且文件体积小。
  • 我试过用纯文本写,但是文件很大。
  • 一个“非常大”的序列导致一个“非常大”的文件。令人惊讶。

标签: python floating-point numbers file-writing


【解决方案1】:

您可以使用struct.pack 函数将浮点数存储为 64 位双精度数:

from struct import pack, unpack

array = [39534.543, 834759435.3445643, 1.003024032, 0.032543, 434.0208]

with open('store', 'wb') as file:
    file.write(pack('d' * len(array) , *array))

以便您以后可以使用struct.unpack 检索数组的值:

with open('store', 'rb') as file:
    packed = file.read()
    array = unpack('d' * (len(packed) // 8), packed) # 8 bytes per double

【讨论】:

    【解决方案2】:

    您的某些数字看起来太短而不能随机化。因此,您可以通过压缩将它们存储在每个浮点数小于 8 个字节的 中。例如:

    商店:

    import lzma
    
    array = [39534.543, 834759435.3445643, 1.003024032, 0.032543, 434.0208]
    
    with open('store', 'wb') as file:
        file.write(lzma.compress(repr(array).encode()))
    

    加载:

    import lzma, ast
    
    with open('store', 'rb') as file:
        array = ast.literal_eval(lzma.decompress(file.read()).decode())
    
    print(array)
    

    即使是随机数据,我平均得到不到 8 个字节:

    >>> n = 10**5
    >>> a = [random.random() for _ in range(n)]
    >>> len(lzma.compress(repr(a).encode())) / n
    7.98948
    

    诚然,这相当慢,至少在我的随机数据中是这样。对于非随机数据可能更快。或者可以尝试较低的压缩级别或其他压缩之一。 pickle 模块还提到了压缩,因此可能值得一试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 2010-11-30
      相关资源
      最近更新 更多