0

読み込む必要のあるデータ ファイルが大きすぎて、リストへの読み込みに時間がかかりすぎます。これにマルチプロセスを使用するにはどうすればよいですか? つまり、プロセスファイルの読み取りとリストへのロードを並列化したいのです。助けてください。

基本的に、以下のようなリストにロードする必要があるデータテーブルがあります。ファイルの読み込みには時間がかかりませんが、リスト (myList) への読み込みには約 1 分かかります。それで、これを並列化することは可能ですか:

def load_file(self, fileName):    
    time_start = time.time()
    myList = []
    # mySet = set()
    lines = self.read_file(fileName)
    # time_end = time.time()
    # print fileName, ": loaded ",  round(time_end-time_start, 4)," seconds" 
    for line in lines:  
        content = line.split()   
        myList.append(content)
    time_end = time.time()
    print fileName, ": ", len(myList), " rows loaded in", round(time_end-time_start, 4)," seconds"    
    return myList

def read_file(self, fileName): 
    filePath = self.data_directory + '\\' + fileName     
    try:
        with open(filePath, 'r') as f:
            lines = f.readlines()
            f.close()
            return lines
    except ValueError:
        print filePath + ' does not exist' 

その場しのぎの方法として、(ファイルに 2M 行あると仮定すると、len(lines) = 2M)、最初の 1M を myList1 にロードし、2 番目の 1M を myList2 に並行してロードしてから、それらをマージします (myList = myList1+myList2)。しかし、これはベスト プラクティスとは思えません。

4

2 に答える 2

1

基本的に、大きなファイルで file.readlines() を呼び出すことは決して良い考えではありません。この行が何をするのかわかりません

self.read_file(fileName)

しかし、それは file.readlines() を呼び出すのではないかと心配しています。

通常、リストに数百万行の大きなファイルを含めることは望ましくありません。それはあなたの記憶を食い尽くすでしょう。

大きなファイルの行をフィルタリング/変換し、結果の行を別のファイルに書き込む場合は、行をリストにロードする代わりに反復子を使用します。

これらの線に沿ってソリューションを整理することをお勧めします。このアプローチは、数ギガバイトのサイズのファイルを簡単に処理できます。

def split_lines(file):
    with open(file) as f:
        for line in f:                
            yield line.split()

def process_splitted_lines(file):
    for splitted_line in split_lines(file):
        <do some other thing with splitted line>
        yield something

def write_result_lines(file):
    for something in process_splitted_lines(file):
        line = <do some other thing with something>
        <write line to resultfile>
于 2014-01-09T19:01:49.290 に答える