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

时间:2019-06-24 13:00:05

标签: python sqlite storage heightmap

作为一种业余爱好,我尝试用python编写基本游戏,并且需要存储游戏世界的地图。可以将其视为存储高度的二维数组。关键是,目前,我的地图尺寸为5000x5000。

我将其存储在sqlite数据库中(在创建结束时模式为CREATE TABLE map (x SMALLINT, y SMALLINT, h SMALLINT); + VACCUM),但是磁盘上最多需要500MB。

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

您将如何在python中存储这种数据? int的2维数组,或该尺寸(或更大)的列表3 int元组,它是否仍可以在Raspberry Pi上运行?速度并不重要,但RAM和文件大小很重要。

2 个答案:

答案 0 :(得分:0)

您需要10位来存储每个高度,因此10个字节可以存储8个高度,因此31.25Mo可以存储所有25,000,000个高度。您可以确定哪个10字节的块存储了所需的高度(如何取决于它们的排列方式),而一点点的移位就可以隔离出您想要的特定高度(因为每个高度都会在2个相邻字节之间划分)。

答案 1 :(得分:0)

我最终将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()