最大限度地减少Python中对磁盘的读取和写入操作,以实现内存繁重的操作

Edw*_*tte 17 python memory io

背景

我正在为计算语言学项目开发​​一个计算密集的项目,但我遇到的问题非常普遍,因此我希望解决方案对其他人来说也很有趣.

要求

我必须写的这个特定程序的关键方面是它必须:

  1. 通读大型语料库(介于5G和30G之间,以及可能更大的内容)
  2. 处理每一行的数据.
  3. 从这个处理过的数据中,构建了大量的向量(这些向量中的一些向量的维数> 4,000,000).通常它正在构建数十万个这样的载体.
  4. 这些向量必须以某种格式或其他格式保存到磁盘.

步骤1和2并不难有效:只需使用生成器并拥有数据分析管道.最大的问题是操作3(和连接4)

括号:技术细节

如果构建向量的实际过程影响解决方案:

对于语料库中的每一行,一个或多个向量必须更新其基重.

如果你根据python列表来考虑它们,每一行在处理时,通过将一个或多个索引处的这些列表的值递增一个值来更新一个或多个列表(如果需要,可以创建它们)(可能会因此而异)指数).

向量不依赖于彼此,也不重要读取语料库的顺序.

试图解决方案

关于如何做到这一点,有三个极端:

  1. 我可以在内存中构建所有向量.然后将它们写入磁盘.
  2. 我可以直接在磁盘上构建所有向量,使用pickle架子或一些这样的库.
  3. 我可以一次一个地在内存中构建向量并将其写入磁盘,每个向量通过语料库一次.

所有这些选择都相当棘手.1只是耗尽了所有的系统内存,它会引起恐慌和减速.因为IO操作不快,所以2太慢了.出于同样的原因,3可能甚至比2慢.

目标

一个好的解决方案包括:

  1. 在记忆中尽可能地建设.
  2. 内存已满后,将所有内容转储到磁盘.
  3. 如果再次从磁盘需要位,则将它们恢复到内存中以向这些向量添加内容.
  4. 回到1直到构建完所有向量.

问题是,我不确定如何解决这个问题.担心像RAM这样的系统属性似乎有点单声道,但我没有看到如何在不考虑这一点的情况下最佳地解决这类问题.结果,我真的不知道如何开始这种事情.

有谁知道如何解决这类问题?我的python根本不是这种东西的正确语言?或者是否有一个简单的解决方案可以最大化从内存中完成多少(在合理范围内),同时最小化必须从磁盘读取数据或写入数据的次数?

非常感谢您的关注.我期待着看到stackoverflow的聪明才智能够引起我的注意.

额外细节

运行这个问题的机器通常有20多个内核和~70G的RAM.该问题可以并行化(例如,MapReduce),因为可以从语料库的片段构建一个实体的单独向量,然后将其添加以获得将从整个语料库构建的向量.

部分问题涉及确定在磁盘写入需要发生之前可以在内存中构建多少的限制.python是否提供任何机制来确定可用的RAM数量?

Rem*_*emi 5

看看pytables.其中一个优点是您可以处理存储在磁盘上的大量数据,就像它在内存中一样.

编辑:因为I/O性能将成为瓶颈(如果不是瓶颈),您将需要考虑SSD技术:每秒高I/O,几乎没有寻求时间.您的项目规模非常适合当今价格合理的SSD'驱动器'.