我正在尝试处理文件(每行都是一个json文档).文件的大小可以达到mbs到100的mbs.所以我写了一个生成器代码来逐行从文件中获取每个文档.
def jl_file_iterator(file):
with codecs.open(file, 'r', 'utf-8') as f:
for line in f:
document = json.loads(line)
yield document
Run Code Online (Sandbox Code Playgroud)
我的系统有4个核心,所以我想并行处理4行文件.目前我有这个代码,一次需要4行,并调用代码进行并行处理
threads = 4
files, i = [], 1
for jl in jl_file_iterator(input_path):
files.append(jl)
if i % (threads) == 0:
# pool.map(processFile, files)
parallelProcess(files, o)
files = []
i += 1
if files:
parallelProcess(files, o)
files = []
Run Code Online (Sandbox Code Playgroud)
这是我的代码,实际处理发生
def parallelProcess(files, outfile):
processes = []
for i in range(len(files)):
p = Process(target=processFile, args=(files[i],))
processes.append(p)
p.start()
for i in range(len(files)):
processes[i].join()
def processFile(doc): …
Run Code Online (Sandbox Code Playgroud) 我有一个大文件,我需要阅读并从中制作字典.我希望这个尽可能快.但是我在python中的代码太慢了.这是一个显示问题的最小示例.
首先制作一些假数据
paste <(seq 20000000) <(seq 2 20000001) > largefile.txt
Run Code Online (Sandbox Code Playgroud)
现在这里有一段最小的python代码来读取它并制作一本字典.
import sys
from collections import defaultdict
fin = open(sys.argv[1])
dict = defaultdict(list)
for line in fin:
parts = line.split()
dict[parts[0]].append(parts[1])
Run Code Online (Sandbox Code Playgroud)
时序:
time ./read.py largefile.txt
real 0m55.746s
Run Code Online (Sandbox Code Playgroud)
但是它不是I/O绑定的:
time cut -f1 largefile.txt > /dev/null
real 0m1.702s
Run Code Online (Sandbox Code Playgroud)
如果我注释掉这dict
条线需要9
几秒钟.似乎几乎所有的时间都花在了dict[parts[0]].append(parts[1])
.
有什么方法可以加快速度吗?我不介意使用cython甚至C,如果这会产生很大的不同.或者熊猫可以在这帮忙吗?
以下是大小为10000000行的文件的配置文件输出.
python -m cProfile read.py test.data 20000009 function calls in 42.494 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.000 …
Run Code Online (Sandbox Code Playgroud)