如何使用 python 存储 25M 3-D int 元组?

How to store 25M 3-D int tuple with python?

出于业余爱好,我尝试在 python 中编写一个基本游戏代码,我需要存储游戏世界的地图。它可以看作是一个二维数组来存储高度。关键是,目前我的地图尺寸是 5000x5000。

我将它存储在一个 sqlite 数据库中(架构:CREATE TABLE map (x SMALLINT, y SMALLINT, h SMALLINT); + VACCUM 在创建结束时),但它在磁盘上最多占用 500MB。

我可以压缩(例如lzma)sqlite文件,它只需要~35-40MB,但是为了在python中使用它,我需要先解压它,所以它总是最终占据了这么多位置。

您将如何在 python 中存储此类数据? 一个 int 的二维数组,或该维度(或更大)的列表 3-int 元组,它仍然可以 运行 在 Raspberry Pi 上?速度并不重要,但 RAM 和文件大小很重要。

每个高度需要10位来存储,所以10个字节可以存储8个高度,这样31.25Mo可以存储全部25,000,000个。您可以找出哪个 10 字节的块存储所需的高度(如何取决于您如何排列它们),并且稍微移动可以隔离您想要的特定高度(因为每个高度将在 2 个相邻字节之间拆分)。

我终于使用了 HDF5 文件格式和 pyTables。 结果是一个约 20MB 的文件,包含完全相同的数据,可供应用程序直接使用。 以下是我的创建方式:

import tables

db_struct = {
    'x': tables.Int16Col(),
    'y': tables.Int16Col(),
    'h': tables.Int16Col()
}
h5file = tables.open_file("my_file.h5", mode="w", title='Map')
filters = tables.Filters(complevel=9, complib='lzo')
group = h5file.create_group('/', 'group', 'Group')
table = h5file.create_table(group, 'map', db_struct, filters=filters)
heights = table.row

for y in range(0, int(MAP_HEIGHT)):
    for x in range(0, int(MAP_WIDTH)):
        heights['x'] = x
        heights['y'] = y
        heights['h'] = h
        heights.append()
    table.flush()

table.flush()
h5file.close()