我将游戏世界(5,000 x 5,000 int 的二维数组,介于 -100 和 900 之间)存储在 SQLite 数据库中:
CREATE TABLE map (x SMALLINT, y SMALLINT, h SMALLINT);
加上
VACCUM
之后 INSERT
需要 500MB。我可以将文件压缩 (lzma) 到 35-40MB,但要使用它,我需要解压缩。我如何存储它,以便它仍然可以在 Raspberry Pi 上运行?一个 2D int 数组,还是一个 3-int 元组列表?速度并不重要,重要的是 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()