Я хочу обработать данные (содержащиеся в файле диска, позже загруженном в numpy.array
экземпляр) с такими строками, как:
1 3 a
1 4 b
1 5 a
2 6 b
, где первый столбец - время начала, второй столбец - конец время и третий столбец является идентификатором. Я хочу обработать эти данные, чтобы определить количество идентификаторов в каждый момент запуска, например:
1 2
2 2
3 2
4 2
5 2
6 1
, где первый столбец - время начала, а второй столбец - количество идентификаторов
I написал следующий код, чтобы обработать его как:
j=[] # a list of ids
for i in range( len( dataset1 ) ):
indices = numpy.argwhere( ( dataset1[i,0] >= dataset[:,0] )
& ( dataset1[i,0] <= dataset[:,1] )
)
j.append( len( set( dataset[indices[:,0],2] ) ) )
где:
- dataset1
имеет первый столбец как 1,2,3,4,5,6 временных меток и
- dataset
имеет три столбца: время начала, время окончания и идентификатор.
Мне нужно обработать около 9 сотен миллионов строк, как указано в dataset1
. Это очень медленно.
Я пытался распараллелить это как:
inputs = range( len( dataset1 ) )
def processInput( b ):
indices = numpy.argwhere( ( b >= dataset[:,0] )
& ( b <= dataset[:,1] )
)
return( len( set( dataset[indices[:,0],2] ) ) )
num_cores = 10
results = Parallel( n_jobs = num_cores )( delayed( processInput )( dataset[j,0] ) for j in inputs )
Но это все еще медленно. У меня есть еще 10 доступных ядер, но тогда диск становится узким местом.
Есть ли способ быстрой обработки этих данных?