多进程、多线程处理文件对比

分别通过多进程、多线程方式处理文件,将结果保存到一个list中:

1.多进程:

import multiprocessing,cjson,os,collections
from multiprocessing import Process,freeze_support,Manager,Pool,Queue

def handlefile(lock,rst,fp):
    lst_tmp=[]
    #print type(rst)
    with open(fp,‘rb‘) as fo:
        for line in fo:
            line = cjson.decode(line)
            lst_tmp.append(line[‘s-ip‘])
    #print collections.Counter(lst_tmp)
    lock.acquire()
    rst.extend(lst_tmp)
    lock.release()

if __name__ == ‘__main__‘:
    lock = Manager().Lock()
    rst = Manager().list()

    starttime = datetime.datetime.now()
    f1 = ‘e:\\logtest\\iis__20160519105745.json‘
    f2 = ‘e:\\logtest\\iis__20160519105816.json‘
    f3 = ‘e:\\logtest\\iis_IDC-ExFE01_20160524134616.json‘
    f4 = ‘e:\\logtest\\iis_IDC-ExFE01_20160524134955.json‘
    f5 = ‘e:\\logtest\\iis_IDC-ExFE01_20160524134616.json‘
    f6 = ‘e:\\logtest\\iis_IDC-ExFE01_20160524134955.json‘
    files = [f1,f2,f3,f4,f5,f6]
    p=Pool()
    for file in files:
        p.apply_async(handlefile,args=(lock,rst,file))
    p.close()
    p.join()

    print collections.Counter(rst)

    print (datetime.datetime.now() - starttime).total_seconds() #耗时16.631s

2.多线程:

import threading
global rst
rst = []
def query(mutex,fp):
    lst_tmp=[]
    #print type(rst)
    with open(fp,‘rb‘) as fo:
        for line in fo:
            line = cjson.decode(line)
            lst_tmp.append(line[‘s-ip‘])
    #print collections.Counter(lst_tmp)
    mutex.acquire()
    rst.extend(lst_tmp)
    mutex.release()

if __name__ == ‘__main__‘:
    threads=[]
    mutex=threading.Lock()
    starttime = datetime.datetime.now()
    f1 = ‘e:\\logtest\\iis__20160519105745.json‘
    f2 = ‘e:\\logtest\\iis__20160519105816.json‘
    f3 = ‘e:\\logtest\\iis_IDC-ExFE01_20160524134616.json‘
    f4 = ‘e:\\logtest\\iis_IDC-ExFE01_20160524134955.json‘
    f5 = ‘e:\\logtest\\iis_IDC-ExFE01_20160524134616.json‘
    f6 = ‘e:\\logtest\\iis_IDC-ExFE01_20160524134955.json‘
    files = [f1,f2,f3,f4,f5,f6]

    for filepath in files:
        t = threading.Thread(target=query,args=(mutex,filepath))
        t.setDaemon(True)
        t.start()
        threads.append(t)
    for t in threads:
        t.join()

    print collections.Counter(rst)

    print (datetime.datetime.now() - starttime).total_seconds() #耗时4.425s

结论:多进程和多线程在分别处理每个文件,将结果写入各自tmp list中,多线程耗时2.468s,多线程耗时4.24s,多进程优于多线程(进程数量未控制,默认CPU核心数量)。

但当多线程各结果写入到共享变量list()时,多线程严重耗时较久,多线程共计耗时4.425s,多进程耗时16.631s。多进程中的共享变量效率低下。

时间: 2024-08-27 23:52:41

多进程、多线程处理文件对比的相关文章

关于Python和Java的多进程多线程计算方法对比

原文请见 关于Python和Java的多进程多线程计算方法对比 搞大数据必须要正视的一个问题就是并行计算.就像执行一件任务一样,大伙一起同时干,才有效率,才会很快出成果.正所谓"众人拾柴火焰高"~ 对于并行计算,有很多高大上的概念,我也不全懂.这里就单单罗列一下我对于多进程和多线程计算的理解和总结. 在计算机中,处理一个任务,可以在一个进程中,也可以在一个线程中,确切的说,执行的话都得靠一个个线程来.在我们做某件事的时候,往往需要同时干多个任务才能达到我们所要的效果,比如说看电影,就要

文件下载与文件对比

首先说一下前端代码如何实现文件下载: <a href="Template.xlsx">模板文件下载</a> 有些文件,比如exe,xls,zip文件等,浏览器会弹出保存文件的提示框:有些文件如txt,img文件等,浏览器则是直接打开,各种浏览器对其处理的方式也有不同. C#后台实现文件下载的代码 1 protected void btnDown_Click(object sender, EventArgs e) 2 { 3 string filename = S

Python按行读文件对比

1. 最基本的读文件方法: # File: readline-example-1.py file = open("sample.txt") while 1:     line = file.readline()     if not line:         break     pass # do something 一行一行得从文件读数据,显然比较慢:不过很省内存. 在我的机器上读10M的sample.txt文件,每秒大约读32000行 2. 用fileinput模块 # File

Python文件对比

环境: python2.6.6 linux系统 对比文件差异用Python里的difflib模块: Python自带difflib模块,无需安装. 对比两个文件是否一样总体思路就是:将文件里的内容读出来然后再对比 符号 含义 + 包含在第二个序列中,但不包含第一个序列中 - 包含在第一个序列中,但不包含第二个序列中 ? 标志两个序列行存在增量差异 ^ 标志两个序列存在的差异字符 '' 两个序列行一致 示例一: #!/usr/bin/python #coding:utf-8 #2017,8,27

文件夹差异文件对比工具 meld

/***************************************************************************************** * 文件夹差异文件对比工具 meld * 说明: * 之前就听说Lee使用文件夹文本差异对比软件winmerge,不过如果要在Linux下使用,那么就要 * 装wine才行了,索性还是换一个在Linux下通用的比较好,于是选择了meld. * * 2016-9-15 深圳 南山平山村 曾剑锋 ************

list集合、txt文件对比的工具类和文件读写工具类

工作上经常会遇到处理大数据的问题,下面两个工具类,是在处理大数据时编写的:推荐的是使用map的方式处理两个list数据,如果遇到list相当大数据这个方法就起到了作用,当时处理了两个十万级的list,使用改方法的变种搞定. 1.txt文件.list集合比较工具 <span style="font-family:KaiTi_GB2312;font-size:18px;">package com.hudong.util.other; import java.util.Colle

文件对比工具有哪些用途

我们常常会遇到一些文件需要进行比较,特别是一些文本.网页.复杂的源代码文件或者是文件夹,我们非常迫切地需要一款工具可以清晰地分析出它们之间的全部差异,便于对其进行修改或参考. Beyond Compare就是一款这样专业级文件比较软件,我们常常会在一些开发高手和前辈的推荐中听到它的大名.当打开文件对比工具Beyond Compare主页面时,可以看到软件可执行的比较会话类型丰富,那么作为软件新手的你,你的打开方式正确吗?你知道Beyond Compare有哪些强大的比较会话吗? Beyond C

哪款文件对比工具用起来比较简单

在平时学习和工作的过程中,我们或许经常需要对两个文件进行比较,包括两张图片的对比.两个文本之间的对比.两个音乐之间的对比.表格数据的对比.注册表文件的对比等等,仔细想来对比需求是无处不在的. 大多时候我们应该都是纯人力操作,比如用肉眼来辨别图片之间的不同,用耳朵来判断音频之间的不同.虽然这种方法很直接,但是在电脑上这么做实在是太原始了,对比速度也是十分的缓慢,今天小编就为大家推荐一款专业的文件和文件夹对比工具:Beyond Compare. Beyond Compare使用地址参考:http:/

linux下多进程的文件拷贝与进程相关的一些基础知识

之前实现了用文件IO的方式可以实现文件的拷贝,那么对于进程而言,我们是否也可以实现呢? 答案是肯定的. 进程资源: 首先我们先回顾一下,进程的运行需要哪些资源呢?其资源包括CPU资源,内存资源,当然还有时间片资源,我们都知道进程是有 栈, 堆,  只读数据段,  数据段(已初始化的全局变量静态变量),bss段(未初始化的),   代码段还有一组寄存器值. 进程命令: 另外我们也可以通过 ps  -ef |grep 进程名命令来查看进程号(PID)和父进程号(PPID),之后还可以通过 ps au