酸洗numpy数组或列表时的Pickle文件大小

时间:2015-09-09 17:05:16

标签: python arrays list numpy pickle

我有数千个长整数列表(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数组在将它们腌制成文件后占用的空间是否比列表更多?

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

提前感谢您的时间。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:-2)

如果你提供的数据接近准确,这对我来说似乎是不成熟的优化,因为这实际上不是很多数据,而且据说只是整数。我现在正在用数百万个条目,字符串和整数来挑选文件,然后你可以担心优化。在您的情况下,差异可能并不重要,特别是如果这是手动运行并且不会提供给某些webapp或类似的。