【问题标题】:Pickle file size when pickling numpy arrays or lists腌制numpy数组或列表时腌制文件大小
【发布时间】:2015-12-05 18:33:42
【问题描述】:

我有数千个长 (8640) 整数列表的元组。例如:

type(l1)
tuple

len(l1)
2

l1[0][:10]
[0, 31, 23, 0, 0, 0, 0, 0, 0, 0]

l1[1][:10]
[0, 0, 11, 16, 24, 0, 0, 0, 0, 0] 

我正在“腌制”元组,似乎当元组是列表时,pickle 文件比 numpy 数组时更轻。我对 python 并不陌生,但绝不是专家,我真的不知道如何为不同类型的对象管理内存。我本来希望 numpy 数组更轻,但这是我在腌制不同类型的对象时得到的:

#elements in the tuple as a numpy array
l2 = [np.asarray(l1[i]) for i in range(len(l1))]
l2
[array([ 0, 31, 23, ...,  2,  0,  0]), array([ 0,  0, 11, ...,  1,  0,  0])]

#integers in the array are small enough to be saved in two bytes
l3 = [np.asarray(l1[i], dtype='u2') for i in range(len(l1))]
l3
[array([ 0, 31, 23, ...,  2,  0,  0], dtype=uint16),
 array([ 0,  0, 11, ...,  1,  0,  0], dtype=uint16)]

#the original tuple of lists
with open('file1.pkl','w') as f:
     pickle.dump(l1, f)

#tuple of numpy arrays
with open('file2.pkl','w') as f:
    pickle.dump(l2, f)

#tuple of numpy arrays with integers as unsigned 2 bytes
with open('file3.pkl','w') as f:
    pickle.dump(l3, f)

当我检查文件的大小时:

 $du -h file1.pkl
  72K   file1.pkl

 $du -h file2.pkl
  540K  file2.pkl

 $du -h file3.pkl
 136K   file3.pkl

所以即使整数保存在两个字节中,file1 也比 file3 轻。我更喜欢使用数组,因为解压缩数组(并处理它们)比列表快得多。但是,我将存储大量这些元组(在 pandas 数据框中),因此我还想尽可能优化内存。

我需要这个工作的方式是,给定一个我做的元组列表:

#list of pickle objects from pickle.dumps
tpl_pkl = [pickle.dumps(listoftuples[i]) for i in xrange(len(listoftuples))]

#existing pandas data frame. Inserting new column 
df['tuples'] = tpl_pkl

总的来说,我的问题是:numpy 数组在将它们腌入文件后比列表占用更多空间是否有原因?

也许如果我理解了我可以找到存储数组的最佳方式的原因。

提前感谢您的宝贵时间。

【问题讨论】:

  • 我不知道这些存储的确切方法,但是我确实遇到了类似的问题,并使用 hickle 包解决了它。 github.com/telegraphic/hickle 这会将 numpy 数组保存到 HDF5 格式的文件中,可以选择 gzip 并最终变得更小。另一个很棒的地方是它使用与 pickle 相同的语法。
  • 为什么要将序列化对象存储在数据框中?换句话说,你为什么将泡菜转储存储在数据框中?
  • @ijmarshall:谢谢!我去看看那个包
  • @gabe:这些数组必须“链接”到一系列 id 和一些其他特征(即数据框的其他列),如果可能的话,必须在索引结构中。最终,数据集将被查询、连接等。我考虑过使用 pySQLite,并遵循相同的格式,即将 pickle.dumps 存储在 sqlite 数据库的表中。然而,经过一番阅读,我认为 pandas 已经足够了。无论如何,在这个阶段,任何其他想法都非常受欢迎。

标签: python arrays list numpy pickle


【解决方案1】:

如果您想在磁盘上存储 numpy 数组,则根本不应该使用 pickle。调查numpy.save() 及其亲属。

如果您使用的是pandas,那么它也有自己的方法。您可能想咨询this article 或this question 的答案以获得更好的技术。

【讨论】:

  • 感谢holdenweb。问题是这些中的每一个都将是熊猫数据框中的一行。我正在做row_n = pickle.dumps(tuple[n]),然后将其插入熊猫数据框中,我认为 numpy.save() 不可能。
  • 更新了几个有用的 Pandas 链接。祝你好运!
  • 我已经编辑了我的问题,以防万一。我会看看这些链接。谢谢!
  • 其他人可能会提供更好的答案,但考虑到您的数据量,我怀疑时间可能比速度更重要
【解决方案2】:

如果您提供的数据接近准确,这对我来说似乎是过早的优化,因为这确实不是很多数据,而且应该只是整数。我现在正在腌制一个包含数百万个字符串和整数条目的文件,然后你就可以担心优化了。在您的情况下,差异可能并不那么重要,特别是如果这是手动运行并且不提供给某些 web 应用程序或类似应用程序的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 2019-01-21
    • 2014-01-16
    • 1970-01-01
    相关资源
    最近更新 更多