6

8コア、16 GBのRAMワークステーションを使用して、数百ギガバイトのデータをすばやくbzip2圧縮したいと考えています。現在、私は単純なpythonスクリプトを使用して、bzip2とos.walk呼び出しに結合されたos.system呼び出しを使用してディレクトリツリー全体を圧縮しています。

bzip2は単一のCPUのみを使用し、他のCPUは比較的アイドル状態のままであることがわかります。

私はキューとスレッド化されたプロセスの初心者です。しかし、4つのbzip2実行スレッド(実際にはos.systemスレッドを推測します)をそれぞれがおそらく独自のCPUを使用して、キューからファイルをbzipで枯渇させるように、これをどのように実装できるのか疑問に思っています。

私のシングルスレッドスクリプトはここに貼り付けられています。

import os
import sys

for roots, dirlist , filelist in os.walk(os.curdir):
    for file in [os.path.join(roots,filegot) for filegot in filelist]:
        if "bz2" not in file:
            print "Compressing %s" % (file)
            os.system("bzip2 %s" % file)
            print ":DONE" 
4

2 に答える 2

1

subprocessモジュールを使用して、一度に複数のプロセスを生成します。それらのN個が実行されている場合(NはCPUの数より少し大きい必要があります。たとえば、2コアの場合は3、8の場合は10)、1つが終了するのを待ってから、別のCPUを開始します。

並列化できないディスクアクティビティが多数あるため、これはあまり役に立たない可能性があることに注意してください。キャッシュ用の多くの空きRAMが役立ちます。

于 2010-07-27T15:32:33.363 に答える
1

comp.lang.pythonでMRABから次のコードを試してください。

import os 
import sys 
from threading import Thread, Lock 
from Queue import Queue 
def report(message): 
     mutex.acquire() 
     print message 
     sys.stdout.flush() 
     mutex.release() 
class Compressor(Thread): 
     def __init__(self, in_queue, out_queue): 
         Thread.__init__(self) 
         self.in_queue = in_queue 
         self.out_queue = out_queue 
     def run(self): 
         while True: 
             path = self.in_queue.get() 
             sys.stdout.flush() 
             if path is None: 
                 break 
             report("Compressing %s" % path) 
             os.system("bzip2 %s" % path) 
             report("Done %s" %  path) 
             self.out_queue.put(path) 
in_queue = Queue() 
out_queue = Queue() 
mutex = Lock() 
THREAD_COUNT = 4 
worker_list = [] 
for i in range(THREAD_COUNT): 
     worker = Compressor(in_queue, out_queue) 
     worker.start() 
     worker_list.append(worker) 
for roots, dirlist, filelist in os.walk(os.curdir): 
     for file in [os.path.join(roots, filegot) for filegot in filelist]: 
         if "bz2" not in file: 
             in_queue.put(file) 
for i in range(THREAD_COUNT): 
     in_queue.put(None) 
for worker in worker_list: 
     worker.join() 
于 2010-10-22T01:25:24.850 に答える