python稀疏矩阵创建paralellize加速

时间:2017-05-30 07:39:28

标签: python python-2.7 parallel-processing mapreduce sparse-matrix

我正在通过从输入文件中提取特征来创建稀疏矩阵文件。输入文件在每行中包含一个电影ID,然后是一些功能ID,并且具有得分。

6729792 4:0.15568 8:0.198796 9:0.279261 13:0.17829 24:0.379707

第一个数字是电影的ID,然后冒号左边的值是要素ID,右边的值是该要素的得分。 每行代表一部电影,feature:score对的数量因电影而异。

这是我如何构造我的稀疏矩阵。

import sys
import os
import os.path
import time
import numpy as np
from Film import Film
import scipy
from scipy.sparse import coo_matrix, csr_matrix, rand

def sparseCreate(self, Debug):

    a = rand(self.total_rows, self.total_columns, format='csr')


    l, m = a.shape[0], a.shape[1]


    f = tb.open_file("sparseFile.h5", 'w')

    filters = tb.Filters(complevel=5, complib='blosc')
    data_matrix = f.create_carray(f.root, 'data', tb.Float32Atom(), shape=(l, m), filters=filters)

    index_film = 0
    input_data = open('input_file.txt', 'r')

    for line in input_data:
        my_line = np.array(line.split())

        id_film = my_line[0]
        my_line = np.core.defchararray.split(my_line[1:], ":")
        self.data_matrix_search_normal[str(id_film)] = index_film
        self.data_matrix_search_reverse[index_film] = str(id_film)

        for element in my_line:

            if int(element[0]) in self.selected_features:
                column = self.index_selected_feature[str(element[0])]
                data_matrix[index_film, column] = float(element[1])

        index_film += 1
    self.selected_matrix = data_matrix

    json.dump(self.data_matrix_search_reverse,
              open(os.path.join(self.output_path, "data_matrix_search_reverse.json"), 'wb'),
              sort_keys=True, indent=4)
    my_films = Film(
        self.selected_matrix, self.data_matrix_search_reverse, self.path_doc, self.output_path)
    x_matrix_unique = self.selected_matrix[:, :]
    r_matrix_unique = np.asarray(x_matrix_unique)
    f.close()

    return my_films

问题:

我觉得这个函数在大数据集上太慢了,计算时间太长。
如何改善和加速它?也许使用MapReduce?这个函数有什么问题导致它太慢?

1 个答案:

答案 0 :(得分:0)

IO +转换(从str到str,甚至2次到相同var的str等)+ split + explicit循环。顺便说一句,有一个CSV python模块可用于解析你的输入文件,你可以试验它(我想你用空格作为分隔符)。此外,我'看到你将element[0]转换为int / str,这是不好的 - 你创建了许多tmp。宾语。如果多次调用此函数,可能会尝试重用一些内部对象(数组?)。此外,您可以尝试以另一种方式实现它:使用地图或列表理解,但需要实验... Python代码优化的一般概念是避免显式的Python字节码执行,并且更喜欢本机/ C Python函数(对于任何事情)。并确保尝试解决这么多转换。此外,如果输入文件是您的,您可以将其格式化为固定长度的字段 - 这有助于您完全避免拆分/解析(仅字符串索引)。