我正在尝试用python实现一个程序,该程序可以从4个不同的文件读取,更改数据并将其写入另一个文件。
当前,我正在尝试使用4个不同的进程读取和更改数据,以加快运行时间。
我已经尝试使用manager.list,但这会使脚本比顺序脚本慢。
是否可以在进程之间共享一个列表,或者使每个进程返回一个列表并使用这些列表扩展主进程中的列表?
谢谢
代码看起来像这样(当前myLists保持为空,因此没有任何内容写入output.csv):
from multiprocessing import Process
import queue
import time
myLists=[[],[],[],[]]
myProcesses = []
def readAndList(filename,myList):
with open(filename,"r") as file:
content = file.read().split(":")
file.close()
j=1
filmid=content[0]
while j<len(content):
for entry in content[j].split("\n"):
if len(entry)>10:
print(entry)
myList.append(filmid+","+entry+"\n")
else:
if len(entry)>0:
filmid=entry
j+=1
if __name__ == '__main__':
start=time.time()
endList=[]
i=1
for loopList in myLists:
myProcesses.append(Process(target=readAndList,args=("combined_data_"+str(i)+".txt",loopList)))
i+=1
for process in myProcesses:
process.start()
for process in myProcesses:
process.join()
k=0
while k<4:
endList.extend(myLists[k])
k+=1
with open("output.csv","w") as outputFile:
outputFile.write(''.join(endList))
outputFile.flush()
outputFile.close()
end = time.time()
print(end-start)
答案 0 :(得分:0)
尝试使用现代方式。
例如。
假设我们有几个存储数字的文件,例如
1
2
3
4
以此类推。
本示例从文件中抓取它们并将其合并到列表列表中,因此您可以根据需要合并它们。该示例使用信号量来限制并行读取的次数(4)。我使用的是python 3.7.2,它也应该在3.7中工作,但我不确定。
代码
#!/usr/bin/python3
# -*- coding: utf-8 -*-
from asyncio import Semaphore, ensure_future, gather, run
limit = 4
async def read(file_list):
tasks = list()
result = None
sem = Semaphore(limit)
for file in file_list:
task = ensure_future(read_bounded(file, sem))
tasks.append(task)
result = await gather(*tasks)
return result
async def read_bounded(file, sem):
async with sem:
return await read_one(file)
async def read_one(file):
result = list()
with open(file, 'r+') as f:
for line in f.readlines():
result.append(int(line[:-1]))
return result
if __name__ == '__main__':
files = ['1', '2', '3', '4']
res = run(read(files))
print(res)
输出
[[1、2、3、4、5],[6、7、8、9、10],[11、12、13、14、15],[16、17、18、19、20 ]]
我认为这种方法更快,更容易阅读。此示例可以扩展为从WEB提取数据,您可以阅读有关信息here
Asyncio和aiohttp是非常好的工具。我建议尝试它们。