2014-11-06 24 views
12

Pandas dataframe ile çoklu işlemeyi kullanmaya çalışıyorum, bu da veri çerçevesini 8 parçaya böler. Uygulamayı kullanarak her parçaya bazı fonksiyonlar uygulayın (her parça farklı işlemlerle işlenir). pandaların çoklu işlemden geçirilmesi

DÜZENLEME

: İşte nihayet bulundu çözüm:

import multiprocessing as mp 
import pandas.util.testing as pdt 

def process_apply(x): 
    # do some stuff to data here 

def process(df): 
    res = df.apply(process_apply, axis=1) 
    return res 

if __name__ == '__main__': 
    p = mp.Pool(processes=8) 
    split_dfs = np.array_split(big_df,8) 
    pool_results = p.map(aoi_proc, split_dfs) 
    p.close() 
    p.join() 

    # merging parts processed by different processes 
    parts = pd.concat(pool_results, axis=0) 

    # merging newly calculated parts to big_df 
    big_df = pd.concat([big_df, parts], axis=1) 

    # checking if the dfs were merged correctly 
    pdt.assert_series_equal(parts['id'], big_df['id']) 
+0

içinde bir boşluk var = res = df.apply (süreç geçerli, eksen = 1) ', doğru mu? –

+1

@yemu Bu kodla tam olarak neyi başarmaya çalışıyorsunuz? – Dalek

+0

, şu anda sadece CPU'nun bir çekirdeğini doygun uygular. Çok işlemciyi kullanmak ve işlem süresini azaltmak için tüm çekirdekleri kullanmak istiyorum – yemu

cevap

3

Ben senin veri senaryonun pek olmadığından, bu bir tahmin, ama p.map kullanarak önermek yerine ile apply_async ediyorum geri aramak.

p = mp.Pool(8) 
pool_results = p.map(process, np.array_split(big_df,8)) 
p.close() 
p.join() 
results = [] 
for result in pool_results: 
    results.extend(result) 
+0

@yemu bu sizin için işe yarar mı? –

+0

Eğer aramayı __name__ == '__main__' ise içeriye koymak zorunda kaldım. ve diğer küçük değişimlerle çalışmayı başardım, ancak sonuçta elde edilen sonuçların havuzdaki sonuçları, bölünmüş oldukları sırayla döndürülüp döndürülmediğinden emin değilim. Kontrol etmeliyim. – yemu

+0

dask 'https://stackoverflow.com/questions/37979167/how-to-parallelize-many-fuzzy-string-comparisons-using-apply-in-pandas ile ilgili bir çözüm için buraya bakın. –

0

Ben büyük bir dataframe farklı yığın fonksiyonu uygulamak için multiprocessing.map() kullandığımda da aynı sorun haline çalıştırın.

Sadece diğer insanların benim yaptığım gibi aynı sorunla karşılaşması durumunda birkaç nokta eklemek istiyorum.

  1. if __name__ == '__main__':
  2. Eğer ipython/jupyter notebook kullanırsanız, o zaman multiprocessing koşamam, bir .py dosyasında dosyayı yürütmek eklemeyi unutmayın
(bu, benim durum için geçerlidir hiçbir ipucu var gerçi)
İlgili konular