【问题标题】:writing large CSV files - dictionary based CSV writer seems to be the problem编写大型 CSV 文件 - 基于字典的 CSV 编写器似乎是问题所在
【发布时间】:2010-08-31 21:44:19
【问题描述】:

我有一大包单词数组(单词及其计数)需要写入大型平面 csv 文件。

在大约 1000 个单词的测试中,这很好用 - 我使用 dictwriter 如下:

self.csv_out = csv.DictWriter(open(self.loc+'.csv','w'), quoting=csv.QUOTE_ALL, fieldnames=fields)

其中fields 是单词列表(即,在我传递给csv_out.writerow 的字典中的键)。

然而,这似乎是可怕的扩展,并且随着单词数量的增加 - 写一行所需的时间呈指数增长。 csv 中的dict_to_list 方法似乎是我麻烦的始作俑者。

我不完全知道如何在这里开始优化?我可以使用任何更快的 CSV 例程吗?

【问题讨论】:

    标签: python csv


    【解决方案1】:

    好的,这绝不是答案,但我查看了 csv 模块的源代码,发现模块中有一个非常昂贵的 if not 签入(§ 136-在 python 2.6 中为 141)。

    if self.extrasaction == "raise":
        wrong_fields = [k for k in rowdict if k not in self.fieldnames]
        if wrong_fields:
            raise ValueError("dict contains fields not in fieldnames: " +
                             ", ".join(wrong_fields))
    return [rowdict.get(key, self.restval) for key in self.fieldnames]
    

    所以一个快速的解决方法似乎是在创建作者时传递extrasaction="ignore"。这似乎大大加快了速度。

    不是一个完美的解决方案,也许有些明显,但只是发布它对其他人有帮助..

    【讨论】:

      【解决方案2】:

      明显的优化是使用csv.writer 而不是DictWriter,为每一行传入可迭代对象而不是字典。这没有帮助吗?

      当您说“字数”时,您是指 CSV 中的列数吗?因为我从未见过需要数千个的 CSV!也许您已经转置了数据并且正在写入列而不是行?每行应代表一个数据,其部分由列定义。如果您确实需要这种大小,也许数据库是更好的选择?

      【讨论】:

      • 嗯 - 这就是我最初所做的,它使代码更加混乱,就像现在一样 - 这真的是最后的手段。 更新: 它是一组用于 R 的单词分析 - 我需要为它遇到的每个单词创建一个列...
      • @Malang:“我需要为遇到的每个单词创建一个列”。如果这是您的要求,为什么添加列(以及行)会打扰您?显然它是 O (n*m) 并且不能很好地扩展。你有什么问题?
      • 好吧 - 它使它在计算上几乎难以处理,我希望有一些优化途径......
      • @Malang:“在计算上几乎是棘手的,我希望有一些优化途径”??什么?如果它是棘手的,那就是棘手的。你需要从根本上改变算法。您无法将 O (n*m) 处理优化为 O (n) 处理。
      猜你喜欢
      • 1970-01-01
      • 2019-09-15
      • 1970-01-01
      • 1970-01-01
      • 2019-02-07
      • 1970-01-01
      • 1970-01-01
      • 2011-11-04
      • 1970-01-01
      相关资源
      最近更新 更多