簡體   English   中英

Python:使用多個核心的流程文件

[英]Python: Process file using multiple cores

我目前正在嘗試讀取一個大文件(8000萬行),我需要為每個條目進行計算密集型矩陣乘法。 計算完之后,我想將結果插入數據庫。 由於此過程采用時間密集的方式,我希望將文件拆分為多個核心以加快進程。

在研究之后,我發現了這個有希望的嘗試,它將文件分成n個部分。

def file_block(fp, number_of_blocks, block):
    '''
    A generator that splits a file into blocks and iterates
    over the lines of one of the blocks.

    '''

    assert 0 <= block and block < number_of_blocks
    assert 0 < number_of_blocks

    fp.seek(0,2)
    file_size = fp.tell()

    ini = file_size * block / number_of_blocks
    end = file_size * (1 + block) / number_of_blocks

    if ini <= 0:
        fp.seek(0)
    else:
        fp.seek(ini-1)
        fp.readline()

    while fp.tell() < end:
        yield fp.readline()

迭代地,您可以像這樣調用函數:

if __name__ == '__main__':
    fp = open(filename)
    number_of_chunks = 4
    for chunk_number in range(number_of_chunks):
        print chunk_number, 100 * '='
        for line in file_block(fp, number_of_chunks, chunk_number):
            process(line)

雖然這有效,但我遇到了問題,使用多處理並行化:

fp = open(filename)
number_of_chunks = 4
li = [file_block(fp, number_of_chunks, chunk_number) for chunk_number in range(number_of_chunks)]

p = Pool(cpu_count() - 1)
p.map(processChunk,li)

由於錯誤,生成器無法被腌制。

雖然我理解這個錯誤,但是首先迭代整個文件以將所有行放入列表中是太昂貴了。

此外,我希望每次迭代使用每個核心的行塊,因為一次將多行插入數據庫更有效(如果使用典型的映射方法,則不是1乘1)

謝謝你的幫助。

不是預先創建生成器並將它們傳遞到每個線程,而是將其留給線程代碼。

def processChunk(params):
    filename, chunk_number, number_of_chunks = params
    with open(filename, 'r') as fp:
        for line in file_block(fp, number_of_chunks, chunk_number):
            process(line)

li = [(filename, i, number_of_chunks) for i in range(number_of_chunks)]
p.map(processChunk, li)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM