Одновременное присвоение массиву numpy - PullRequest
4 голосов
/ 03 апреля 2012

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

myMatrix[ "rowLabel", "colLabel" ] = 1.0

В основном это реализовано как

def __setitem__( self, row, col, value ):
  ... # Check validity of row/col labels.
  self.__matrixRepresentation[ ( self.__rowMap[row], self.__colMap[col] ) ] = value

Я присваиваю значения в таблице базы данных этой структуре данных, и было просто написать цикл для этого. Однако я хочу выполнить этот цикл 100 миллионов или более раз, и итеративный извлечение фрагментов значений из таблицы базы данных и перемещение их в эту структуру занимает больше времени, чем я бы предпочел.

Все значения, которые я извлекаю из таблицы базы данных, имеют разные пары (строка, столбец). Следовательно, мне кажется, что я мог бы распараллелить вышеупомянутое присваивание, но я не знаю, допускают ли множественные массивы одновременное присваивание, используя какой-то механизм внутренней блокировки для атомарных операций, или вообще запрещает какой-либо такой мыслительный процесс. Если у кого-то есть предложения или критика, я буду признателен (Если возможно, в этом случае я бы предпочел не прибегать к Cython или PyPy.)

1 Ответ

2 голосов
/ 03 апреля 2012

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

Если это вообще возможно, не храните свою матрицу в этой базе данных.Существуют специальные форматы для эффективного хранения больших массивов.HDF5 / NetCDF приходят на ум.Существуют отличные библиотеки Python / NumPy для использования наборов данных HDF5.Не имея дополнительной информации о формате или назначении базы данных и / или матрицы, я не могу дать вам лучшие рекомендации по хранению.

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

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