2

我有一个很大的文本文件目录——大约 7 GB。我需要将它们快速加载到 iPython 中的 Python unicode 字符串中。我总共有 15 GB 的内存。(我使用的是 EC2,所以如果绝对必要,我可以购买更多内存。)

对于我的目的来说,简单地阅读文件太慢了。我尝试将文件复制到 ramdisk,然后将它们从那里加载到 iPython 中。这加快了速度,但 iPython 崩溃(没有足够的内存剩余?)这是 ramdisk 设置:

mount -t tmpfs none /var/ramdisk -o size=7g

有人有想法么?基本上,我正在寻找持久的内存中 Python 对象。iPython 要求禁止使用 IncPy: http: //www.stanford.edu/~pgbovine/incpy.html

谢谢!

4

2 回答 2

3

这里有很多令人困惑的地方,这使得回答这个问题变得更加困难:

  • ipython 要求。为什么需要在 ipython 中而不是独立脚本中处理如此大的数据文件?
  • tmpfs RAM 磁盘。我将您的问题解读为暗示您在 Python 中一次将所有输入数据读入内存。如果是这种情况,那么 python 会分配自己的缓冲区来保存所有数据,并且 tmpfs 文件系统只有在您从 RAM 磁盘多次重新加载数据时才会为您带来性能提升。
  • 提到 IncPy。如果您的性能问题可以通过 memoization 解决,为什么您不能手动为最有帮助的功能实现 memoization?

所以。如果您实际上一次需要内存中的所有数据-例如,如果您的算法多次重新处理整个数据集-我建议查看该mmap模块。这将以原始字节而不是unicode对象提供数据,这可能需要在您的算法中进行更多工作(例如,对编码数据进行操作),但会使用合理数量的内存。一次将数据全部读入 Pythonunicode对象将需要 2 倍或 4 倍的 RAM 占用磁盘空间(假设数据为 UTF-8)。

如果您的算法只是对数据进行一次线性传递(就像您提到的 Aho-Corasick 算法一样),那么您最好一次只读取一个合理大小的块:

with codecs.open(inpath, encoding='utf-8') as f:
    data = f.read(8192)
    while data:
        process(data)
        data = f.read(8192)

我希望这至少能让你更接近。

于 2010-09-09T09:44:49.880 回答
2

我看到你的问题中提到了 IncPy 和 IPython,所以让我插入我的一个项目,它有点朝着 IncPy 的方向发展,但可以与 IPython 一起使用并且非常适合大数据:http://packages.python .org/joblib/

如果您将数据存储在 numpy 数组中(字符串可以存储在 numpy 数组中),joblib 可以使用 memmap 来获取中间结果,并且对 IO 非常有效。

于 2010-09-11T13:32:24.833 回答