作为一种业余爱好,我尝试用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和文件大小很重要。
答案 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()