如何在python中有效地计算160146 160146矩阵逆?

时间:2017-08-26 06:32:17

标签: python-3.x scipy pytables matrix-inverse

我的研究是结构动力学,我正在处理大对称稀疏矩阵计算。最近,我必须计算与4813762非零元素相反的刚度矩阵(160146乘160146)。我确实计算了一个较小的刚度矩阵逆,15000乘15000大小,它几乎或完全密集。最初我尝试使用几乎所有scipy.sparse.linalg函数来计算通过Ax = b形式的逆。目前,我正在使用superlu来计算L和U矩阵然后使用它我使用Solve()计算逆。由于矩阵逆是密集的,我无法存储在RAM内存中我选择了pytables。

不幸的是,一列逆矩阵的写入时间大约需要16分钟(每个步骤的时间在代码之后如下所示),并且刚度矩阵总共存在160146列。我想知道如何提高写入速度,以便这个反向任务将在几天内完成。代码如下,

LU= scipy.sparse.linalg.splu(interior_stiff) 
interior_dof_row_ptr=160146
#---PyTables creation Code for interior_stiff_inverse begins--#
if(os.path.isfile("HDF5_Interior.h5")==False):     
    f=tables.open_file("HDF5_Interior.h5", 'w')
    #                    compression-level and compression library   
    filters=tables.Filters(complevel=0, complib='blosc')
    #                   f.root-> your default group in the HDF5 file "firstdata"->name of the dataset  
    #                                        tables.Float32Atom()->WHat si your atomic data object? 
    if(f.__contains__("/DS_interior_stiff_inverse")==False):
        print("DS_Interior_stiff_inverse DOESN'T EXIST!!!!!")
        out=f.create_carray(f.root, "DS_interior_stiff_inverse", tables.Float32Atom(), shape=(interior_dof_row_ptr,interior_dof_row_ptr), filters=filters)
        #out=f.create_earray(f.root, "DS_interior_stiff_inverse", tables.Float32Atom(), shape=(interior_dof_row_ptr,0), filters=filters, expectedrows=interior_dof_row_ptr)
    else:
        print("DS_interior_stiff_inverse EXISTS!!!!!")
        out=f.get_node("/", "DS_interior_stiff_inverse")

    #interior_stiff_inverse=numpy.zeros((interior_dof_row_ptr,interior_dof_row_ptr))
    for i in range(0,interior_dof_row_ptr):
        I=numpy.zeros((interior_dof_row_ptr,1)) 
        I[i,0]=1
        #--   COmmented by Libni - interior_stiff_inverse[:,i]=LU.solve(I[:,0]) #In pytables how we define the variables. So interior_stiff_inverse_1 only needs to be stored in pytables. 
        print("stating solve() calculation for inverse: ", datetime.datetime.now())
        tmpResult=LU.solve(I[:,0])
        print("solve() calculation for inverse DONE: ", datetime.datetime.now())
        out[:,i]=tmpResult
        print("Written to hdf5 (pytable) :", datetime.datetime.now())
        #out.append(LU.solve(I[:,0]))
        print(str(i) + "th iteration of " + str(interior_dof_row_ptr) + " Interior Inv done")
        f.flush()
        print("After FLUSH line: ", datetime.datetime.now())
    f.close()

#--***PyTables creation Code for interior_stiff_inverse begins-***

Solve()计算和写入hdf5所用的时间如下,

stating solve() calculation for inverse: 2017-08-26 01:04:20.424447
solve() calculation for inverse DONE: 2017-08-26 01:04:20.596045
Written to hdf5 (pytable) :2017-08-26 01:20:57.228322
After FLUSH line: 01:20:57.555922

这清楚地表明将一列逆矩阵写入hdf5需要16分钟。如果我需要计算整个矩阵逆,我需要1779天。我相信写作时间可以提升。我不知道我怎么能做到这一点。请帮助我提高写入速度hdf5,以便矩阵逆运行可以在几天内完成。

我在hdf5创建中使用了0压缩,认为这将有助于快速读写。 我的电脑规格包括带有4个内核和16个RAM的i7。

任何帮助将不胜感激。

谢谢你, 保罗托马斯

0 个答案:

没有答案