|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 House 于 2018-11-14 14:32 编辑
. U! P6 [5 D, w6 x v5 j* d1 H& C) X; n8 W( r
多进程(multiprocessing)
5 y2 ]. P2 o( f- T2 a深度学习中对数据高效处理常常会需要并行,这时多进程就派上了用场。考虑这样一个场景,在数据准备阶段,有很多文件需要运行一定的预处理,正好有台多核服务器,我们希望把这些文件分成32份,并行处理:
/ z( V: t H1 l/ d6 [$ f- U
& f1 U3 x5 ~7 Q* ~" @3 d! [" vfrom multiprocessing import Process#, freeze_support M2 J) y7 s; u- E. @; Q) P" E
+ @& I2 }, @, O% w" Q S) Ydef process_data(filelist):
+ W- n5 b' K, E6 G yfor filepath in filelist:
, r7 W! G s: @# l8 ^$ W, m% Wprint('Processing {} ...'.format(filepath))
# d" X# u9 B( }/ d% Q# a# 处理数据
0 W3 [* Y9 H5 a6 r ~7 ]6 E...' d# C& |5 n; W$ g
: @6 Z# {) @# t2 Pif __name__ == '__main__':! F/ x- v- R* l* R& B! T1 P5 w
# 如果是在Windows下,还需要加上freeze_support()
* v: _0 w& V1 l8 K#freeze_support()& O o9 s; x) k% U# T. E
+ }; S0 x) p5 m, ~
# full_list包含了要处理的全部文件列表4 A+ r, p! r+ [4 o) W" J$ K
...) M/ L9 ^' y" T; F5 b( g
p- k0 ^ h6 T& q5 o% Y& z
n_total = len(full_list) # 一个远大于32的数
! q+ M5 @0 I( {& q9 Bn_processes = 322 ^" n9 p# r R4 Q
% |- Q+ ~5 ]' b) I' t
# 每段子列表的平均长度& e: Z4 {5 ^- Y |: H: i I
length = float(n_total) / float(n_processes)
7 @1 C3 e/ `- Z1 z. g( O) P! {: ^1 j% g# |6 k3 x
# 计算下标,尽可能均匀地划分输入文件列表
, G0 q: Y" `* e+ rindices = [int(round(i*length)) for i in range(n_processes+1)]5 U: N- e- i5 Q$ s3 `
, w, Q5 t0 H( m3 i1 F. Y& L1 y) U# 生成每个进程要处理的子文件列表! z5 }, L0 _. V% U3 {
sublists = [full_list[indices:indices[i+1]] for i in range(n_processes)]: m' @' ^ G. e5 O
Y6 P+ G' ?* n1 g) H, p# 生成进程6 g4 U/ y m a }& b, o
processes = [Process(target=process_data, args=(x,)) for x in sublists]5 D6 Q# q6 k x) z8 I+ f
% Y+ z6 P% t" A8 t3 {# 并行处理
) I# n7 i+ M" I4 qfor p in processes:; d8 r9 K7 M/ E: P4 ?
p.start()% M: p: P! ]1 k, l
' M" q l0 K: r9 M" r5 ]( o
for p in processes:
4 y5 m5 k2 E* \) bp.join() | $ A; b& a J: V" ^& p, P" n
4 G) P1 U5 N( [! m5 y5 Z( |) [. t. ?5 S9 V, w
9 w+ y/ }; r6 x6 ^( Q. ?; o
4 _$ z) Q& n& h
, b$ e. k l$ b( M/ y+ \4 B | ! D3 o3 X& H! Q8 I) L
|
' ]; x- K, ^( `1 g- } |
|