具有多个输入的luigi任务的体系结构

时间:2016-11-28 11:48:16

标签: python-3.x parallel-processing luigi

我有多个pickle文件,每个日期在2005年到2010年之间。每个文件都包含一个单词字典及其各自的频率。我还有一个"主文件"包含整个时期的所有独特单词。总共有大约500万字。

我需要获取所有数据并为每个单词生成一个CSV文件,每个日期将有一行。例如,文件some_word.txt

2005-01-01,0.0003
2005-01-02,0.00034
2005-01-03,0.008

我在使用luigi框架组织此过程时遇到了麻烦。我当前的顶级任务只需一个字,查找每个日期的相关频率,并将结果存储在CSV文件中。我想我可以循环浏览主文件中的每个单词并使用该单词运行任务,但我估计这需要几个月,如果不是更长的话。这是我在简化版中的顶级AggregateTokenFreqs任务。

class AggregateTokenFreqs(luigi.Task):
    word = luigi.Parameter()

    def requires(self):
        pass  # not sure what to require here, master file?

    def output(self):
        return luigi.LocalTarget('data/{}.csv'.format(self.word))

    def run(self):
        results = []
        for date_ in some_list_of_dates:
            with open('pickles/{}.p'.format(date_), 'rb') as f:
                freqs = pickle.load(f)
                results.append((date_, freqs.get(self.word))

        # Write results list to output CSV file

1 个答案:

答案 0 :(得分:0)

@MattMcKnight说你可能会更好地使用多处理。但是,如果你想在这里使用Luigi,你可以做什么:

  • Luigi有你配置的工人的概念。这是并行运行不同任务的本地进程数。
  • 您可以对任务建模,而不是通过所有泡菜“循环”,将一个泡菜传递给任务(作为参数)。您必须将结果写入具有唯一名称的目录中的TSV。
  • 有一个循环,每个pickle(日期)创建一个任务。配置工人数量(即5)。这样你就可以同时处理5个文件。
  • 您需要一个额外的任务,将所有单个CSV文件“加入”一个。

希望这有帮助。