【问题标题】:Reparsing a file or unpickling重新解析文件或取消腌制
【发布时间】:2012-06-19 15:34:34
【问题描述】:

我有一个 100Mb 的文件,其中包含大约 1000 万行,每次运行代码时都需要将其解析为字典。这个过程非常缓慢,我正在寻找加快速度的方法。想到的一个想法是解析文件一次,然后使用 pickle 将其保存到磁盘。我不确定这会导致加速。

任何建议表示赞赏。

编辑: 做了一些测试后,我担心创建字典时会出现速度变慢。酸洗似乎确实要快得多,尽管我不介意做得更好。

拉利特

【问题讨论】:

  • 这需要几分钟才能尝试。你试过了吗?
  • 取决于你正在做多少解析工作,如果是 > 比pickler完成的工作。您可能只是受 I/O 限制。只有一种方法可以找出答案,我认为 Stackoverflowers 不会为你做这件事:)
  • 每行如何在字典中结束?
  • 我会进行一些测试并让人们知道。每行的格式为 a,b,c,d,我创建了一个字典存储,这样 store[a] = (b,c,d)。请注意,a 可能出现在许多不同的行上。
  • 您是否使用for 循环将数据输入dict?将其改写为列表理解可以使您的代码显着加快。

标签: python file pickle


【解决方案1】:

根据我的经验,MessagePack 在 python 中转储/加载数据比 cPickle 快得多,即使使用最高协议也是如此。

但是,如果您有一本包含 1000 万条条目的字典,您可能需要检查一下您是否没有达到计算机内存的上限。如果您的内存不足并且必须使用交换,该过程会发生得更慢。

【讨论】:

  • 他说这是一个 100 mb 的文件。他不太可能内存不足。
  • @ChinmayKanchi 字典数据结构实际上会产生相当多的内存开销。我用一个 1000 万行、100 mb 文件进行快速测试,每行一个空格分隔的键和值膨胀到超过 1Gb 的内存。根据您的实际操作,成本可能会迅速增加。
【解决方案2】:

根据您使用数据的方式,您可以

  • 将其分成许多较小的文件并仅加载需要的文件
  • 为文件创建索引并延迟加载
  • 将其存储到数据库中,然后查询数据库

您能否更好地了解您的数据是什么样的(结构)?

您如何使用这些数据?你真的在每次执行时都使用每一行吗?如果每次运行只使用一个子集,是否可以对数据进行预排序?

【讨论】:

  • 每次执行时我都需要每一行。数据已预先排序 - 读取数据仍然很慢。
猜你喜欢
  • 2021-10-19
  • 2015-12-05
  • 2021-03-05
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多