同时分配到numpy数组

时间:2012-04-03 04:11:28

标签: python sql numpy multiprocessing

我有一个数据结构,它作为2D numpy数组的包装器,以便使用带标签的索引并执行语句,如

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

我将数据库表中的值分配给此数据结构,为此编写循环很简单。但是,我想要执行这个循环1亿次或更多次,并且从数据库表中迭代检索值块并将它们移动到这个结构需要比我想要的更多的时间。

我从数据库表中检索的所有值都有不同的(行,列)对。 因此,似乎我可以并行化上述赋值,但我不知道numpy数组是否允许使用某种内部锁定机制进行原子操作的同时赋值,或者它是否完全禁止任何此类思考过程。如果有人有任何建议或批评,我将不胜感激。 (如果可能的话,在这种情况下,我宁愿不使用cython或PyPy。)

1 个答案:

答案 0 :(得分:2)

此处不太可能在该级别执行并行执行。全球翻译锁将破坏你的一天。此外,您仍然需要按顺序从数据库中提取每组值,这很可能会使进程内的映射查找和数组赋值相形见绌。特别是如果数据库在远程计算机上。

如果可能的话,不要将矩阵存储在该数据库中。存在用于有效存储大型阵列的专用格式。想到HDF5 / NetCDF。有很好的Python / NumPy库可供使用HDF5数据集。由于没有关于数据库和/或矩阵的格式或目的的进一步信息,我无法真正为您提供更好的存储建议。

如果您无法控制数据的存储方式,那么您只需要等待数据进入。根据您使用的数据以及更新频率,您可能只是等待一次,然后数据库中的更新可以在单独的线程中写入它们。

(无关的术语问题:“CPython”是标准的Python解释器。我认为你的意思是你不想使用C,Cython,Boost Python等编写CPython的扩展。)