【问题标题】:IOError writing very large fileIOError 写入非常大的文件
【发布时间】:2016-12-21 21:52:02
【问题描述】:

我有一个 python 模块,负责对我想要使用的数据集进行一些预处理/标记。数据集是一个 144M 行的文本文件,我将其读入内存,分成不同的部分,随机播放,然后写入新文件。以前,写入是通过以下函数完成的:

def write_lines(filename, lines):
with io.open(filename, 'w', encoding='utf-8') as fout:
    fout.write('\n'.join(lines))

尝试在 144M 行数据集上执行此操作时,我收到 IOError: [Errno 22] 错误。但是,在 6M 行数据集上运行完全相同的代码没有问题。在将数据集发送到此模块之前,它会通过过滤服务运行,以确保文件中只有与模式 [\x00-\x7f] 匹配的字符,如 this post 中所述。

我在 Anaconda 环境中运行 python2.7。我使用的一些代码来自一个开源项目,该项目执行一些复杂的字符串处理逻辑,无论我尝试过什么,这些逻辑都不适用于 Python3,因此切换到 Python3 不是一种选择(如果这甚至有帮助的话)。

有没有什么方法可以让更大的数据集导致这个错误?我原以为唯一可能出错的是内存错误,但Errno 22 似乎与内存没有任何关系。

【问题讨论】:

  • 过滤步骤可以单独在shuffle之前完成吗?
  • 你在 OSX 上吗?如果你是,看看这个related SO question
  • @Jakub 是的,我在 iMac 上运行代码。
  • @AlexReynolds 不,过滤是在一个单独的 Java 模块(以及许多其他逻辑)中完成的,该模块依赖于预先存在的 Java 类

标签: python python-2.7


【解决方案1】:

您无需将您的线路加入一条大线路。你可能得到一条太长的线。试试这个:

def write_lines(filename, lines):
    with io.open(filename, 'w', encoding='utf-8') as fout:
        for line in lines:
            fout.write(line + '\n')

看看这个question

【讨论】:

  • 或者更简洁:fout.writelines(line + '\n' for line in lines)
猜你喜欢
  • 1970-01-01
  • 2016-06-22
  • 2021-05-09
  • 2016-10-10
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-02
相关资源
最近更新 更多