gpt4 book ai didi

python - 使用 islice 和多处理批量读取和处理大型文本文件

转载 作者:太空宇宙 更新时间:2023-11-03 20:35:13 25 4
gpt4 key购买 nike

代码不返回任何内容,它会永远运行。请帮助编写代码片段。仅供引用:我第一次使用多处理

我的本​​地内存不足,因此从 zip 文件中提取数据。我的想法是使用 islice 一次读取 n 行,并使用 process_logBatch() 处理它们。

在 Windows 计算机上运行此代码 - Jupyter Notebook。

import multiprocessing as mp
import zipfile
from itertools import islice
import time
#import pandas as pd # Unused.

def process_logBatch(next_n_lines):
l = [random.randint(0,100) for i in range(5)]
print(l)
return l

def collect_results(result):
results.extend(result)

pool = mp.Pool(processes=(mp.cpu_count()-1))

results = []

with zipfile.ZipFile('log.zip', 'r') as z:
with z.open('log.txt') as f:

while True:
print(f.closed)
next_n_lines = [x.decode("utf-8").strip() for x in islice(f, 2)]

if not next_n_lines:
break

try:
pool.apply_async(process_logBatch, args=(next_n_lines, ), callback=collect_results)
except Exception as e:
print(e)

if counter == 2:
break
pool.close()
pool.join()

print(results)

最佳答案

有几个问题。一种是在 Windows 上,您需要一个 if __name__ == '__main__': 语句来保护主模块,如多处理模块的 documentation 中标题为“安全导入主模块”的部分所示和讨论的那样。 .

但是,第二件事就没那么容易解决了。每个进程都在自己的内存空间中运行,因此它们并不都有相同的结果列表。为了避免这种情况,我转而使用 Pool.map_async() 并在所有子进程结束时收集结果。

这是我认为可行的方法(基于您的示例代码):

import multiprocessing as mp
import zipfile
from itertools import islice
import time
#import pandas as pd # Unused.
import random # Added.

def process_logBatch(next_n_lines):
l = [random.randint(0,100) for i in range(5)]
print(l)
return l

if __name__ == '__main__':

# Not longer needed.
# def collect_results(result):
# results.extend(result)

pool = mp.Pool(processes=(mp.cpu_count()-1))

with zipfile.ZipFile('log.zip', 'r') as z:
with z.open('log.txt') as f:

counter = 0 # Added to avoid NameError because undefined.

while True:
next_n_lines = [x.decode("utf-8").strip() for x in islice(f, 2)]

if not next_n_lines:
break

try:
results = pool.map_async(process_logBatch, next_n_lines)
except Exception as e:
print(e)

if counter == 2:
break

pool.close()
pool.join()

print(results.get())

关于python - 使用 islice 和多处理批量读取和处理大型文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57209210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com