【Multiprocessing】採用多線程計算作爲data_producer提供訓練數據

0x00 前言

在數據處理方面,通常會將較爲簡單的源數據存於本地磁盤中,
每次使用時讀取,經過生成函數生成模型可以直接使用的訓練數據,
而這種數據通常爲矩陣的形式,考慮到padding位的情況下通常較大,
那麼,在源數據的量較大,而生成的數據的空間佔用增量巨大無法存於本地,
就需要採用生成一個,傳輸一個,消耗一個,之後再生成的形式。

線性終歸是緩慢的,此時就需要多線程進行處理,
如下所示,基本框架以記錄多線程計算的基本方法:
後續有空到時候繼續記錄一下基於此的,時空複雜度均更優的“生產者—消費者”模型。

0x01 Source Code

ori_data = range(65536)

def get_args(i):
    batch_size = 5
    return ori_data[i * batch_size * 200: (i+1) * batch_size * 200], i, 'container_{}'.format(i)

def batch_data_generate_fn(inp, i, name):
    print('Run child process %s (%s)' % (name, os.getpid()))
    # do some calculation etc.
    return inp

def generate_with_multiprocessing(method='default', fn=None):
    import multiprocessing
    targets = {  # pre-defined functions
        # 'segments': generate_original_segments_single_task,
        # 'single': batch_data_generate_single_block,
        # 'batch': batch_data_generate_single_task,
        'default': batch_data_generate_fn,
    }
    print('Run the main process (%s).' % (os.getpid()))

    i = 0
    for i in [2,3,4,6,7,8]:
        p = multiprocessing.Process(
            target=targets.get(method),
            args=fn(i) if fn else (i,))
        p.start()
        i += 1
    print('Waiting for all subprocesses done ...')

generate_with_multiprocessing(method='default', fn=get_args)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章