我有一個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)的變體是最好的爲了我。
我會嘗試英特爾的Python發行版和Python的MPI。你可以在[GoParallel issue](https://goparallel.sourceforge.net/wp-content/uploads/2016/07/intel-parallel-universe-issue-25.compressed.pdf)中瀏覽一下。 – rll
data.csv文件的大小(行數,MB ...)是多少? – glegoux
@glegoux問題現在不是CSV文件的大小,但可以在未來進行縮放 – Eugenio