我正在尝试使用Python读取一个大于20GB的文本文件。该文件包含了400个帧的原子位置,每个帧在我的代码计算中是独立的。理论上,我可以将任务分成400个任务而无需进行任何通信。每个帧有1000000行,因此该文件有1000 000 * 400行文本。我的初始方法是使用进程池的多进程处理:
def main():
""" main function
"""
filename=sys.argv[1]
nump = int(sys.argv[2])
f = open(filename)
s = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
cursor = 0
framelocs=[]
start = time.time()
print (mp.cpu_count())
chunks = []
while True:
initial = s.find(b'ITEM: TIMESTEP', cursor)
if initial == -1:
break
cursor = initial + 14
final = s.find(b'ITEM: TIMESTEP', cursor)
framelocs.append([initial,final])
#readchunk(s[initial:final])
chunks.append(s[initial:final])
if final == -1:
break
这里我基本上是在寻找文件,使用Python的mmap模块打开文件来查找帧的开始和结束,以避免将所有内容读入内存。
def readchunk(chunk):
start = time.time()
part = chunk.split(b'\n')
timestep= int(part[1])
print(timestep)
现在我想将文件块发送到工作池进行处理。 读取部分应该更复杂,但这些行稍后会实现。
print('Seeking file took %8.6f'%(time.time()-start))
pool = mp.Pool(nump)
start = time.time()
results= pool.map(readchunk,chunks[0:16])
print('Reading file took %8.6f'%(time.time()-start))
如果我将8个数据块发送到8个核心并运行,读取需要0.8秒。然而,如果我发送16个数据块到16个核心并运行,需要1.7秒。看起来并行化没有加速。我是在橡树岭峰峰超级计算机上运行此命令,如果有关的话。
jsrun -n1 -c16 -a1 python -u ~/Developer/DipoleAnalyzer/AtomMan/readlargefile.py DW_SET6_NVT.lammpstrj 16
这应该创建1个MPI任务并将16个核心分配给16个线程。 我有什么遗漏的吗? 有更好的方法吗?