Python 高效地将列表、元组和NumPy数组的图形保存到磁盘(异构)
我经常处理大量数据(几GB的顺序),这些数据存储在NumPy阵列的内存中。通常,我会处理这种NumPy数组的嵌套列表/元组。我应该如何将这些存储到磁盘?我想保留数据的列表/元组结构,必须对数据进行压缩以节省磁盘空间,并且保存/加载需要快速 (我现在面临的特定用例是一个4000元素长的2元组列表Python 高效地将列表、元组和NumPy数组的图形保存到磁盘(异构),python,arrays,numpy,serialization,storage,Python,Arrays,Numpy,Serialization,Storage,我经常处理大量数据(几GB的顺序),这些数据存储在NumPy阵列的内存中。通常,我会处理这种NumPy数组的嵌套列表/元组。我应该如何将这些存储到磁盘?我想保留数据的列表/元组结构,必须对数据进行压缩以节省磁盘空间,并且保存/加载需要快速 (我现在面临的特定用例是一个4000元素长的2元组列表x,其中x[0]。shape=(201,)和x[1]。shape=(2011000)) 我尝试过几种选择,但都有缺点: 存储到gzip存档中。这样做效果很好,可以获得可接受的磁盘空间使用率,但速度非常慢,
x
,其中x[0]。shape=(201,)
和x[1]。shape=(2011000)
)
我尝试过几种选择,但都有缺点:
- 存储到
存档中。这样做效果很好,可以获得可接受的磁盘空间使用率,但速度非常慢,在节省内存的同时会消耗大量内存gzip
- 。比pickle快得多,但不幸的是,它只允许使用numpy数组序列(而不是像我这样的嵌套元组/列表)或字典样式的方式指定参数
- 通过存储到HDF5。这对于我相对简单的需求来说似乎太麻烦了。更重要的是,我对此做了很多研究,而且似乎没有一种直接的方法来存储异构(嵌套)列表
- 似乎完全是我想要的,但不幸的是,目前它与Python3不兼容(这就是我正在使用的)
numpy.savez_compressed
的包装器,它将确定数据的嵌套结构,将此结构存储在某个变量nest_structure
中,展平整个图形,并使用numpy.savez_compressed
存储nest_structure
和所有展平的数据。然后,相应的包装器将理解nest\u结构
变量,并重新创建图形并返回它。然而,我希望已经有类似的东西了。你可能会喜欢这个包。它有效地将异构的pickle对象包装到一个方便的文件中<代码>搁置更倾向于“持久存储”,而不是传统的保存到文件模型
使用shelve
的主要好处是可以方便地保存大多数类型的结构化数据。使用shelve
的主要缺点是它是特定于Python的。与HDF-5或保存的Matlab文件甚至简单的CSV文件不同,使用其他工具处理数据并不容易
保存示例(出于习惯,我创建了对象并将其复制到df
,但您不需要这样做。您可以直接保存到df
中的项目):
按照上面的示例,恢复数据:
import shelve
import numpy as np
class C():
alpha = 1.0
beta = [3, 4]
df = shelve.open('test.shelve')
print(df['a'])
print(df['b'])
print(df['c'].alpha)
你可能喜欢这个包裹。它有效地将异构的pickle对象包装到一个方便的文件中<代码>搁置更倾向于“持久存储”,而不是传统的保存到文件模型
使用shelve
的主要好处是可以方便地保存大多数类型的结构化数据。使用shelve
的主要缺点是它是特定于Python的。与HDF-5或保存的Matlab文件甚至简单的CSV文件不同,使用其他工具处理数据并不容易
保存示例(出于习惯,我创建了对象并将其复制到df
,但您不需要这样做。您可以直接保存到df
中的项目):
按照上面的示例,恢复数据:
import shelve
import numpy as np
class C():
alpha = 1.0
beta = [3, 4]
df = shelve.open('test.shelve')
print(df['a'])
print(df['b'])
print(df['c'].alpha)
谢谢,但是我恐怕
shelve
不行。它是一个围绕着pickle
的包装器,它对我的需求来说太慢了(当与gzip
结合时,请参阅原始帖子),或者占用了太多的空间(当不使用压缩时)。谢谢,但我恐怕shelve
不会这样做。它是一个围绕着pickle
的包装器,它对我的需求来说太慢了(当与gzip
结合时,请参阅原始文章),或者占用了太多的空间(当不使用压缩时)。您使用的是什么版本的pythoncPickle
存在于python 2中,并且比pickle
要快得多@Dunes python 3,在后者中默认的pickle
实现与python 2的cPickle
相同。您使用的python版本是什么cPickle
存在于python 2中,并且比pickle
@Dunes python 3快得多,在后者中默认的pickle
实现与python 2中的cPickle
相同。