Требования к оперативной памяти для матричной обработки - PullRequest
2 голосов
/ 26 февраля 2012

Итак, я разрабатываю матрицу для проекта по компьютерному зрению и считаю, что у меня неверный расчет. К сожалению, я не уверен, где это не так.

Я собирался создать матрицу размером 100 000 000 x 100 000 000, в которой каждая ячейка содержала бы одно целое число (1 или 0). Если мои расчеты верны, это займет 9,53674316 × 10 ^ 9 МБ. Это правильно?!?

Мой следующий вопрос: если это правильно, есть ли способы снизить требования к памяти до более реалистичного уровня, сохраняя матрицу того же размера? Конечно, есть реальная возможность, что мне на самом деле не понадобится матрица такого размера, но это абсолютно худший сценарий (предложенный другом). Размер кажется мне нелепым, так как мы бы одновременно преодолевали такое небольшое расстояние.

Thanks1 Anthony

Ответы [ 2 ]

4 голосов
/ 26 февраля 2012

Теоретически элемент {0, 1} должен потреблять не более 1 бита на ячейку.Это означает, что 8 ячеек на байт или 1192092895 мегабайт, или около один петабайт , что слишком много, если вы не гуглите :) Не говоря уже о том, что даже обработка (или сохранение) такой матрицы займет слишком много времени (окологод я бы сказал).

Вы сказали, что во многих случаях вам даже не понадобится такая большая матрица.Таким образом, вы можете создать меньшую матрицу в начале (10 000 x 10 000), а затем удваивать размер каждый раз, когда требуется увеличение, копируя старое содержимое.

Если ваша матрица является разреженной (имеет очень многобольше 1, чем 0 или наоборот), тогда гораздо эффективнее хранить только координаты, где те находятся в некоторой эффективной структуре данных, в зависимости от того, какие операции (поиск, доступ к данным) вам нужны.

Примечание:Во многих языках вы должны позаботиться о том, чтобы это было правдой, например, в C, даже если вы указываете переменную как логическое значение, она по-прежнему занимает один байт, в 8 раз больше, чем необходимо.

1 голос
/ 26 февраля 2012

Ваши вычисления верны, если предположить, что для хранения каждого логического значения используется один байт, что будет делать массив Numpy с dtype=bool.

Если вы ожидаете, что сравнительно небольшое количество элементов матрицы будет одним, рассмотрите возможность использования матрицы scipy.sparse; это будет хранить только те.

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