如何高效存储高度图?

问题描述 投票:0回答:2

我将游戏世界(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 和文件大小。

python sqlite storage heightmap
2个回答
0
投票

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


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()
© www.soinside.com 2019 - 2024. All rights reserved.