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)