2017-06-14 96 views
6

我有一個CSV文件,其中包含項目的特徵值:每行都是一個三元組(id_item,id_feature,value),表示特定項目的特定功能的值。數據非常稀少。計算配對距離矩陣:是一種可用於Python的可擴展的大數據準備方法嗎?

我需要計算兩個項目的距離矩陣,一個使用Pearson相關度量,另一個使用Jaccard索引。

目前,我實現了一個內存解決方案,我做這樣的事情:

import numpy as np 
from numpy import genfromtxt 
from scipy.sparse import coo_matrix 
from scipy.sparse import csr_matrix 
from scipy.stats.stats import pearsonr 
import sklearn.metrics.pairwise 
import scipy.spatial.distance as ds 
import scipy.sparse as sp 

# read the data 
my_data = genfromtxt('file.csv', delimiter=',') 
i,j,value=my_data.T 

# create a sparse matrix 
m=coo_matrix((value,(i,j))) 

# convert in a numpy array 
m = np.array(m.todense()) 

# create the distance matrix using pdist 
d = ds.pdist(m.T, 'correlation') 

d= ds.squareform(d) 

它工作得很好,這是相當快,但它水平是不可擴展的。我希望能夠通過向集羣添加節點來提高性能,並且即使在大數據情況下也可以工作,再次只需添加節點即可。我不在乎這個過程是否需要數小時;距離需要每天更新一次。

什麼是最好的方法? 1)Sklearn pairwise_distances有一個n_jobs參數,可以利用並行計算(http://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise.pairwise_distances.html),但據我所知它支持同一臺機器上的多個內核,而不支持羣集計算。 這是一個相關問題Easy way to use parallel options of scikit-learn functions on HPC但我沒有得到什麼是我的具體情況下最好的解決方案,如果Joblib實際上有問題。

此外,在內存讀取CSV仍然是一個瓶頸的一部分:我可以存儲在CSV HDFS和讀它做這樣的事情:通過cat.stdout

import subprocess 
cat = subprocess.Popen(["hadoop", "fs", "-cat", "data.csv"], stdout=subprocess.PIPE) 

,然後循環:

for line in cat.stdout: 
    .... 

但我不確定這是一個很好的解決方案。

在HDFS 2)存儲數據,實現計算地圖中減少時尚和通過mrjob運行作業

3)在HDFS存儲數據,實現類似SQL的方式計算(我不知道如果它很容易和可行,我必須考慮它)並運行它使用PyHive

當然,我想盡可能保持當前的代碼,所以解決方案1)的變體是最好的爲了我。

+0

我會嘗試英特爾的Python發行版和Python的MPI。你可以在[GoParallel issue](https://goparallel.sourceforge.net/wp-content/uploads/2016/07/intel-parallel-universe-issue-25.compressed.pdf)中瀏覽一下。 – rll

+0

data.csv文件的大小(行數,MB ...)是多少? – glegoux

+0

@glegoux問題現在不是CSV文件的大小,但可以在未來進行縮放 – Eugenio

回答

0

爲原型:

我建議你使用Pyro4並實現與divide and conquer範例,一個主節點和幾個從節點。

如果您有n項,您有n(n-1)/2對,則在每個節點上使用sklearn成對距離和最多作業(n_jobs參數)。

你在a任務中分配你的一組配對,並在b節點上執行該節點,並在主節點上重新組合結果。

對於生產:

我建議你PySpark 2.1.1。Map Reduce將被棄用。

+0

據我所見,沒有一個簡單的方法在火花計算距離(這是我的問題);然而,你的回答正在指引我走向正確的方向,所以我決定無論如何都接受它。 – Eugenio