Каков наилучший способ обработки данных 3D-вокселей? - PullRequest
2 голосов
/ 04 ноября 2011

В данный момент я храню воксели в простом списке. ([0,0,0,0,0,1,0,0,1 ...]) Для извлечения воксельной позиции в списке я использую эту функцию:

def getBlockKey(self, x, y, z):

    blockX = x % CFG_CHUNK_SIZE
    blockY = y % CFG_CHUNK_SIZE
    blockZ = z % CFG_CHUNK_SIZE

    return blockX + blockY * CFG_CHUNK_SIZE + blockZ * (CFG_CHUNK_SIZE * CFG_CHUNK_SIZE)

Но это очень медленно при обработке больших объемов данных. Например, перебор каждого куба в 256 * 256 * 256 порциях занимает 50 секунд.

Я думаю, что было бы быстрее использовать dict, но он использует слишком много памяти.

Не могли бы вы помочь мне найти компромисс между этими двумя?

Ответы [ 2 ]

3 голосов
/ 04 ноября 2011

Вы можете заменить список на bytearray. Предполагая, что вы сохраняете один бит информации на воксель, вы можете хранить 8 вокселей на байт.

Вы также можете попробовать ndarray, из NumPy . Вы можете эффективно создать массив 256 × 256 × 256, который занимает меньше места и быстрее для доступа и управления, чем обычная структура данных Python (определенным образом).

0 голосов
/ 25 января 2014

Возможно, вы захотите проверить библиотеку с открытым исходным кодом в DreamWorks, если вам нужно обрабатывать огромное количество вокселей.

http://www.openvdb.org

...