【问题标题】:python sparse matrix creation paralellize to speed uppython稀疏矩阵创建并行化以加速
【发布时间】:2017-05-30 07:39:27
【问题描述】:

我正在通过从输入文件中提取特征来创建一个稀疏矩阵文件。输入文件的每一行都包含一个电影 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?这个函数有什么问题让它太慢了?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 很遗憾,我无法更改输入文件,您能否建议改进示例代码?究竟应该改变什么以及代码的哪一部分? mapreduce 怎么样?
    猜你喜欢
    • 2011-03-23
    • 2012-01-10
    • 2016-10-23
    • 2021-09-21
    • 2017-03-31
    • 2016-07-29
    • 1970-01-01
    • 2019-05-06
    • 2017-12-16
    相关资源
    最近更新 更多