Python 高效地将列表、元组和NumPy数组的图形保存到磁盘(异构)

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存档中。这样做效果很好,可以获得可接受的磁盘空间使用率,但速度非常慢,

我经常处理大量数据(几GB的顺序),这些数据存储在NumPy阵列的内存中。通常,我会处理这种NumPy数组的嵌套列表/元组。我应该如何将这些存储到磁盘?我想保留数据的列表/元组结构,必须对数据进行压缩以节省磁盘空间,并且保存/加载需要快速

(我现在面临的特定用例是一个4000元素长的2元组列表
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
结合时,请参阅原始文章),或者占用了太多的空间(当不使用压缩时)。您使用的是什么版本的python
cPickle
存在于python 2中,并且比
pickle
要快得多@Dunes python 3,在后者中默认的
pickle
实现与python 2的
cPickle
相同。您使用的python版本是什么
cPickle
存在于python 2中,并且比
pickle
@Dunes python 3快得多,在后者中默认的
pickle
实现与python 2中的
cPickle
相同。