我的研究是结构动力学,我正在处理大对称稀疏矩阵计算。最近,我必须计算与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。
任何帮助将不胜感激。
谢谢你, 保罗托马斯