相关疑难解决方法(0)

使用生成器进行Python多处理

我正在尝试处理文件(每行都是一个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 parallel-processing multiprocessing

13
推荐指数
3
解决办法
9681
查看次数

读入大文件并制作字典

我有一个大文件,我需要阅读并从中制作字典.我希望这个尽可能快.但是我在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)

c python performance cython pandas

8
推荐指数
1
解决办法
4341
查看次数