【问题标题】:How to save files with the lowest possible weight如何以尽可能低的重量保存文件
【发布时间】:2017-12-11 22:16:38
【问题描述】:

我正在尝试使用 pickle 将一些数据保存到文件中。 我的起始列表格式如下:

 a1 = [[190, 187, 27, 24, 4, 1, 0, 2, 6, 9, 60, 62], [190, 187, 27, 24, 4, 1, 0, 2, 6, 9, 61, 65], [190, 187, 27, 24, 4, 1, 0, 2, 6, 9, 60, 63], [190, 187, 27, 24, 4, 1, 0, 2, 6, 9, 61, 65], [190, 187, 27, 24, 4, 1, 0, 2, 6, 8, 48, 50], [190, 187, 27, 24, 4, 1, 0, 2, 6, 9, 61, 64], [190, 187, 27, 24, 4, 1, 0, 2, 6, 8, 48, 51]]

只保留子列表中的第一个和最后一个数字后:

a2 = [[190, 62], [190, 65], [190, 63], [190, 65], [190, 50], [190, 64], [190, 51]]

在我的 base-32 编码之后:

a3 = [['5x', '1x'], ['5x', '21'], ['5x', '1c'], ['5x', '21'], ['5x', '1o'], ['5x', '20'], ['5x', '1p']]

列表“a1”的文件有 224 个字节,列表“a2”有 84 个字节,列表“a3”有 182 个字节。为什么“a3”列表的文件比“a2”列表的文件大?引号会放大文件吗? 在我看来,例如,“5x”将花费不到“190”,同时会减少整个文件的重量。还有其他更有效的方法可以将此类数据存储在文件中吗?

【问题讨论】:

  • 引号表示字符串文字。您正在存储字符串。 190 是一个整数,可能使用 32 位。 “190”是一个字符串,它可能也使用 32 位,每个字符 8 位和一个空终止符。这些是粗略的估计,其他人应该能够用更好的参考来回答。

标签: python python-3.x list pickle


【解决方案1】:

增加大小的不是引号,而是它是一个字符串,因此必须这样表示 - 腌制时,通过 optcodes。

Pickle 也不是真的要非常节省空间(甚至是快速),除非您在酸洗时至少使用 protocol=2

如果您在存储字符串时需要最小大小(不压缩),那么 CSV 应该这样做:

import csv

a3 = [['5x', '1x'], ['5x', '21'], ['5x', '1c'], ['5x', '21'], ['5x', '1o'],
      ['5x', '20'], ['5x', '1p']]

with open("saved_data.csv", "wt", newline="") as f:
    writer = csv.writer(f)
    writer.writerows(a3)

这将生成一个 49 字节的 CSV 文件 (saved_data.csv),如果不进行压缩,您将无法低于该文件。相比之下,即使使用protocol=4 进行酸洗,该数据也会占用 93 个字节。

【讨论】:

  • 感谢您的解释!
  • 嗯...很容易将数据编码为 14 个字节。 (甚至没有使用每个子列表具有相同的第一个值这一事实。)
  • 有趣。怎么样?
  • 更好,因为在第一个位置的原始数据中我有不同的值:)
  • @TomaszPrzemski b''.join(map(bytes, a2))
猜你喜欢
  • 2023-03-07
  • 1970-01-01
  • 2014-07-11
  • 2021-05-22
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
相关资源
最近更新 更多