【问题标题】:Whether my file is opened in RAM while in append mode?我的文件是否在附加模式下在 RAM 中打开?
【发布时间】:2018-02-12 10:43:33
【问题描述】:

我已经编写了一个代码,它会继续附加文件。这是它的代码:

writel = open('able.csv','a',encoding='utf-8',errors='ignore')
with open('test','r',encoding='utf-8',errors='ignore') as file:
    for i in file.readlines():
        data = functionforprocess(i)
        if data is not "":
            writel.write(data)
        if count% 10000 == 0:
            log = open('log','w')
            log.write(str(count))
            log.close()

我的问题是:我在append 模式下打开的文件是否在RAM 中可用?该文件是否像缓冲区一样,意味着如果我将data 存储在变量中然后将变量写入文件等于以附加模式打开文件并直接写入?

请让我摆脱这种困惑。

【问题讨论】:

    标签: python python-2.7 python-3.x file


    【解决方案1】:

    追加是文件I/O的基本功能,由操作系统执行。例如,模式为 aa+ 的 fopen 是 POSIX 标准的一部分。使用文件 I/O,操作系统也倾向于缓冲读取和写入;例如,在大多数情况下,没有必要确保您传递给write 的数据实际上一直都在磁盘上。有时它位于操作系统某处的缓冲区中;有时操作系统会将这些缓冲区转储到磁盘上。如果对您很重要,您可以使用fsync 强制写入;这也是一个很好的理由,可以确保在完成处理后始终对打开的文件对象调用close(或使用上下文管理器);如果您忘记了,您可能会因为操作系统中存在这些缓冲区而出现奇怪的行为。

    所以,回答你的问题。您打开的文件很可能在任何给定时刻都在 RAM 中。但是,据我所知,它对您可用。您可以使用文件 I/O 方法与文件中的数据进行交互,但这并不像有一个缓冲区可以获取内存地址并读回您刚刚写入的内容。至于附加模式写入是否等同于将某些内容存储在缓冲区中然后写入磁盘,我想我会说不。任何类型的文件 I/O 写入都可能会被操作系统以相同的方式缓冲,这是有效的原因是操作系统可以决定何时刷新缓冲区。如果您将内容存储在变量中,然后以原子方式将它们写入磁盘,则您可以决定何时进行写入。

    【讨论】:

    • 不,在附加模式下,文件不在 RAM 中。只有位置被寻找到最后。然后,在下一次写入时,缓冲区被刷新并附加到末尾。
    【解决方案2】:

    open function 的签名是:

    open(file, mode=’r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
    

    如果以“a”(追加)模式打开,则表示:以写入方式打开,如果文件存在则追加到文件末尾。缓冲没有任何意义。

    可以使用 buffering 参数自定义缓冲。引用文档:

    buffering 是一个可选的整数,用于设置缓冲策略。传递 0 以关闭缓冲(仅在二进制模式下允许),1 以选择行缓冲(仅在文本模式下可用),以及整数 > 1 以指示固定大小的块缓冲区的大小(以字节为单位)。当没有给出缓冲参数时,默认缓冲策略如下:

    • 二进制文件以固定大小的块缓冲;缓冲区的大小是通过尝试确定底层设备的“块大小”并回退到 io.DEFAULT_BUFFER_SIZE 的启发式方法来选择的。在许多系统上,缓冲区的长度通常为 4096 或 8192 字节。
    • “交互式”文本文件(isatty() 返回 True 的文件)使用行缓冲。其他文本文件使用上述针对二进制文件的策略。

    在您的示例中,您的文件以文本模式打开以追加。

    因此,在写入过程中,只有一部分数据存储在 RAM 中。如果你写一个“大”数据,它会被分成几个块。

    【讨论】:

    • 您需要更多解释吗?我建议您投票并accept我的回答。
    猜你喜欢
    • 1970-01-01
    • 2020-11-21
    • 2013-08-03
    • 2016-12-02
    • 2018-07-01
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多