Как хранить 25M 3-D Int кортеж с Python? - PullRequest
0 голосов
/ 24 июня 2019

В качестве хобби я пытаюсь написать простую игру на python, и мне нужно хранить карту игрового мира.Его можно рассматривать как двумерный массив для хранения высоты.Дело в том, что на данный момент мои размеры карты составляют 5000x5000.

Я сохраняю это в sqlite db (схема: CREATE TABLE map (x SMALLINT, y SMALLINT, h SMALLINT); + VACCUM в конце создания), но это занимает до500 МБ на диске.

Я могу сжать (например, lzma) файл sqlite, и это займет всего ~ 35-40 МБ, но чтобы использовать его в python, мне нужно сначала распаковать его, поэтомуоно всегда занимает столько места.

Как бы вы хранили такие данные в python?2-D массив int или список из 3-int списка этих измерений (или больше), и он все еще может работать на Raspberry Pi?Скорость не важна, но ОЗУ и размер файла.

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Я наконец-то использовал формат файла HDF5 с pyTables.В результате получается файл размером ~ 20 МБ для точно таких же данных, который может непосредственно использоваться приложением.Вот как я его создаю:

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()
0 голосов
/ 24 июня 2019

Вам нужно 10 бит для хранения каждой высоты, поэтому 10 байтов могут хранить 8 высот, и, таким образом, 31.25Mo может хранить все 25 000 000 из них.Вы можете выяснить, в каком блоке из 10 байтов хранится желаемая высота (как это зависит от того, как вы их расположите), и небольшое смещение может выделить конкретную нужную вам высоту (поскольку каждая высота будет разделена между 2 смежными байтами).

...