我有script.py,其目的是处理多达3个轨迹文件(.gro),用户可以选择在一次执行脚本中分析多少个轨迹文件。我也有多达5种功能(分析类型),用户可以选择在终端上输入多少种功能:
python script.py -f traj1.gro,traj2.gro,traj3.gro -a analysis1,analysis2,analysis3 -o结果
每种分析类型都有其自己的功能,并且用户输入的所有traj文件都存储在一个列表中:analysistypes
。每个traj文件都一个一个地处理,但是所有分析类型都必须同时发生,因此我在代码中的某处使用了
files = [] #['traj1.gro','traj2.gro','traj3.gro']
analysistypes = [] #['analysis1','analysis2','analysis3']
results = '' (everything from the terminal stored using sys.argv)
def analysis1(ffile):
outfile1 = '%s_outfile1_%s.xvg'%(results, ffile[:-4])
with open('%s'%outfile1, 'w') as out:
out.write('@ TITLE "analysis1"')
out.write('\n')
with open(ffile, 'rb') as fi:
...do something
with open('%s'%outfile1, 'a') as out: #outfile1 is output file for analysis 1
for something...
...do something
out.write('\n')
out.write(info)
def analysis2(ffile):
(similar to above, produces output file with info)
... and so on for the other analyses
def runAll(fns,i):
proc = []
for fnName in fns:
fn = globals()[fnName]
p = Process(target=fn, args=(i,))
p.start()
proc.append(p)
for p in proc:
p.join()
for ffile in files:
runAll(analysistypes,ffile)
... rest of the code
我希望每种traj文件的每种分析类型都有一个输出文件。在这种情况下,每个traj文件需要3个输出文件(我有3个),因此总共9个输出文件。这完全可以很好地工作。
问题是,如果我开始尝试尝试4种分析类型。一个输出文件将始终为空白。它在那里并且至少有一个标题,但是数据根本不在那里。我100%肯定这不是功能的问题,因为我分别尝试了100万次,并且只有当我尝试同时运行4次时,它才会混乱。错误消息说:
....有5列而不是5列
但是那不是重点。终端“责备”的功能不一致,并且每次都会更改。另外,当我同时尝试5个时,一个输出文件将是空白的,一个输出文件将是完整的一半,而其他输出文件将完全没问题。
(我还尝试只放入1个traj文件和5种分析类型,得到相同的结果。)
我还在线查找了解决方案并尝试了另一种方法:
我用以下命令替换了for循环中的runAll:
if __name__ == '__main__':
procs = []
for ana in analysistypes:
anaa = globals()[ana]
procs.append(Process(target=anaa, args=(ffile,)))
map(lambda x: x.start(), procs)
map(lambda x: x.join(), procs)
但是它仍然不起作用,我得到了相同的结果。我怀疑每个轨迹文件的文件大小为12 GB。我正在使用Mac,操作系统是Ubuntu,硬盘空间是120 GB,我已经用完55%。可以在这里怪文件大小吗?