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