素材牛VIP会员
这个程序要如何写成多进程?
 Sm***ty  分类:Python  人气:652  回帖:5  发布于6年前 收藏
def openTxt():
    with open("E:/a", 'rb') as f:
        for line in f:
            print(line)
    elapsed = (time.clock() - start)
    print("Time used:", elapsed)

请问这个程序要如何写成多进程来提高效率呢?
txt文件大概3G多。要好长时间,想提高效率。
谢谢

 标签:python

讨论这个帖子(5)垃圾回帖将一律封号处理……

Lv6 码匠
12***23 页面重构设计 6年前#1

切分为多个进程,然后每个进程处理一个patch_size, 每次限定读取chunk_size防止patch_size过大不能一次读入。如果要打印记得加锁。

import multiprocessing
p_list = []
sample_log = 'sample.log'

# in byte
patch_size = 4
chunk_size = 1

# should be equal to file_size/chunk_size
p_num = 5


def process_by_chunk(i, lock):
    # if you want see the print nicely, please add back the lock and indent
    #with lock:
    with open(sample_log, 'r') as f:
        f.seek(i * patch_size)
        while True:
            chunk_data = f.read(chunk_size)
            print 'index : {} read : {}'.format(i, chunk_data)
            if not chunk_data or (f.tell() >= (i + 1) * patch_size):
                break

    return


def main():

    #index = multiprocessing.Value('i', 0)
    lock = multiprocessing.Lock()

    for i in range(p_num):
        p = multiprocessing.Process(target=process_by_chunk, args=(i, lock, ))
        p_list.append(p)
        p.start()

    for p in p_list:
        p.join()

if __name__ == '__main__':
    main()

Lv5 码农
la***gt JS工程师 6年前#2

按chunk分文件进行多线程的话,是不是会把一行分在不同的chunk里?
个人觉得可以用1生产者+n消费者的方法进行多线程协作,这样可以保证每一行的原子性

Lv3 码奴
被***师 学生 6年前#3

for line in f么 难道不是f.read或者readlines么

Lv5 码农
陈***6 软件测试工程师 6年前#4

python3 ,Pool进程池,不要在 IDE里运行,一般IDE对多进程支持不要好~

import multiprocessing as mp

def showtxt(line):
    print('pid:%s, txt:%s' % (mp.current_process().pid, line))

if __name__ == '__main__':
    pool = mp.Pool()
    with open("E:/a", 'r') as f:
        pool.map_async(showtxt, f)
    pool.close()
    pool.join()
    input('ok')    
Lv6 码匠
轩***室 学生 6年前#5

更好的办法是写个parser,把文件内容存储到数据库里面,让数据库去管理多进程多线程,查找优化等等琐碎的东西。

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取