找到系统中最大的文件

目录

如何写程序找到系统中最大的文件呢?关于这个问题其实 这里 已出给了一个python写的效率很高的脚本了(虽然比起Shell还是很慢),但是我们是否可以就进一步改进这个程序呢。

分析

  首先获取最大文件这个和遍历文件的先后无关,所以我们可以想到大数据中常用的MapReduce计算模型,我们对每个目录开一个进程(不超过CPU核数)去得到一个map,
然后我们用生成者-消费者的模型来处理这些数据。看下图  

find_max_file_1.png

代码

#!/usr/bin/python
# -*- coding: utf-8 -*-

from os import walk ,getcwd as pwd
from os.path import join, getsize as fsize ,exists 
import threading
from multiprocessing import Process, Queue


myqueue =  Queue()


def p_file_map(myqueue,path):
    for r in walk(path):
        for f in filter(exists,map(lambda x: join(r[0],x),r[2])):
            myqueue.put([f,fsize(f)], block=False) #非阻塞方式

#这里开4个进程处理,这是我目录下的4个子目录
p1 = Process(target=p_file_map, args=[myqueue,"软件"])
p1.start()

p2 = Process(target=p_file_map, args=[myqueue,"文档"])
p2.start()

p3 = Process(target=p_file_map, args=[myqueue,"系统"])
p3.start()

p4 = Process(target=p_file_map, args=[myqueue,"娱乐"])
p4.start()


def file_reduce():
    max=['0',0]
    while True:
          try:
                 a=myqueue.get(block=True,timeout=3)  #阻塞方式
                 if(a[1]>max[1]):
                    max = a
          except:
                 break
    print max 


file_reduce()


性能测试

#采用上面程序的结果
jimila@CDYJY-JINGML:jimila$ ls
软件  文档  系统  娱乐
jimila@CDYJY-JINGML:jimila$ time maxfile4.py 
['\xe7\xb3\xbb\xe7\xbb\x9f/hiberfil.sys', 6718840832]

real  0m45.694s
user  0m18.444s
sys 0m24.776s

#采用单进程需要模式的结果
jimila@CDYJY-JINGML:jimila$ time maxfile2.py 
/media/jimila/系统/hiberfil.sys

real  0m53.295s
user  0m5.925s
sys 0m17.705s

#看来在IO成为瓶颈时对效率的确有提升


目录