如何在Python中持久存储和有效访问非常大的2D列表?

问题描述

在Python中,我正在读取一个非常大的2D数据网格,该网格总共包含大约200,000,000个数据点。每个数据点都是3个浮点数的元组。将所有这些数据读取到二维列表中经常会导致内存错误。为了解决此内存错误,我希望能够将这些数据读取到硬盘驱动器上的某种表中,当给定网格坐标(即harddrive_table.get(300,42))时可以有效地访问该表。

到目前为止,在我的研究中,我遇到过PyTables,它是HDF5的一种实现,似乎有点过头了;还有内置的shelve库,它使用类似于字典的方法访问已保存的数据,但是键必须是字符串,而将数亿个网格坐标转换为字符串进行存储的性能对于我的使用而言可能会影响性能

是否有任何库可以让我在硬盘驱动器上存储2D数据表,并且可以有效访问单个数据点?

此数据表仅在程序运行时才需要,因此我不关心它的互操作性或它如何将数据存储在硬盘驱动器上,因为程序运行后将被删除

解决方法

  1. HDF5确实可以发挥作用。除了PyTables外,还有更简单的h5py

  2. Numpy可让您将文件mmap直接放入numpy数组。这些值将以最小开销的方式存储在磁盘文件中,其中numpy数组形状提供了数组索引和文件偏移量之间的映射。 mmap使用相同的底层操作系统机制来驱动磁盘缓存,以将磁盘文件映射到虚拟内存,这意味着如果内存允许,可以将整个文件加载到RAM中,但是如果需要,则可以将部分刷新到磁盘(并在以后按需重新加载)并非一次都适合。