2017-06-14 24 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

相关问题