如何使用 python 存储 25M 3-D int 元组?
How to store 25M 3-D int tuple with python?
出于业余爱好,我尝试在 python 中编写一个基本游戏代码,我需要存储游戏世界的地图。它可以看作是一个二维数组来存储高度。关键是,目前我的地图尺寸是 5000x5000。
我将它存储在一个 sqlite 数据库中(架构:CREATE TABLE map (x SMALLINT, y SMALLINT, h SMALLINT);
+ VACCUM
在创建结束时),但它在磁盘上最多占用 500MB。
我可以压缩(例如lzma)sqlite文件,它只需要~35-40MB,但是为了在python中使用它,我需要先解压它,所以它总是最终占据了这么多位置。
您将如何在 python 中存储此类数据?
一个 int 的二维数组,或该维度(或更大)的列表 3-int 元组,它仍然可以 运行 在 Raspberry Pi 上?速度并不重要,但 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()
出于业余爱好,我尝试在 python 中编写一个基本游戏代码,我需要存储游戏世界的地图。它可以看作是一个二维数组来存储高度。关键是,目前我的地图尺寸是 5000x5000。
我将它存储在一个 sqlite 数据库中(架构:CREATE TABLE map (x SMALLINT, y SMALLINT, h SMALLINT);
+ VACCUM
在创建结束时),但它在磁盘上最多占用 500MB。
我可以压缩(例如lzma)sqlite文件,它只需要~35-40MB,但是为了在python中使用它,我需要先解压它,所以它总是最终占据了这么多位置。
您将如何在 python 中存储此类数据? 一个 int 的二维数组,或该维度(或更大)的列表 3-int 元组,它仍然可以 运行 在 Raspberry Pi 上?速度并不重要,但 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()