【问题标题】:Python - HardDrive access when opening filesPython - 打开文件时的硬盘访问
【发布时间】:2011-10-02 07:29:26
【问题描述】:

如果您打开一个文件进行读取,从中读取,关闭它,然后重复该过程(在循环中)python 是否会持续访问硬盘驱动器?因为我的实验似乎不是这样,我想了解原因。

一个(非常)简单的例子:

while True:
    file = open('/var/log/messages', 'r')
    stuff = file.read()
    file.close()
    time.sleep(2)

如果我运行此程序,我的硬盘驱动器访问 LED 会亮一次,然后硬盘驱动器保持休眠状态。这怎么可能? python是否以某种方式将文件的内容保存在RAM中?因为逻辑会告诉我它应该每两秒访问一次硬盘驱动器。

【问题讨论】:

    标签: python hard-drive


    【解决方案1】:

    答案取决于您的操作系统和您拥有的硬盘类型。大多数情况下,当您访问驱动器外的某些内容时,信息会缓存在主内存中,以防您很快再次需要它。根据您的操作系统使用的替换策略,数据可能会在主内存中停留一段时间或很快被替换。

    在某些情况下,您的硬盘驱动器会将经常访问的信息缓存在其自己的内存中,然后当驱动器可能被访问时,它会比必须搜索驱动器更快地检索信息并将其发送到处理器拼盘。

    【讨论】:

    • 好的,谢谢!看来 Linux 正在为我处理事情。
    • 后续问题...如果在此循环运行时对文件进行了更改,则必须再次访问硬盘驱动器以检测这些更改,对吗?
    • @python_anon -- 好吧,这又取决于。在许多情况下,文件实际写入磁盘的时间与文件“写入”文件的时间之间存在延迟。一些操作系统有一个write-through策略,它会立即将数据写入硬盘驱动器,但即使这样,它也会用新写入的数据替换缓存的数据,并且你的文件读取实际上不会去再次回到驱动器。在另一种情况下,回写,数据首先存储在缓存中,最终进入驱动器。但在这种情况下,您的程序也不必再次显式访问驱动器。
    • 那么您所说的是对文件所做的更改会立即写入存储在内存中的文件的“副本”(假设该文件在内存中)?这些更改可能会“等待”写入磁盘,具体取决于操作系统?很高兴知道!
    • @python_anon -- 是的,这通常是它的工作方式。在某些情况下,您可以保存文件,确认文件已保存,然后在系统崩溃时实际丢失数据。这将是非常罕见的,因为数据写入非常频繁,但对于某些系统来说,这就是它的工作方式。
    【解决方案2】:

    如果文件在两者之间没有更改,您的操作系统或文件系统可能足够智能,可以从操作系统缓存中提供文件。

    【讨论】:

    • 是的,操作系统中的文件缓存优化了此操作。所有现代操作系统都具有此功能。在 linux 上检查“top”以确定缓冲区缓存的大小。 tldp.org/LDP/tlk/fs/filesystem.html
    • 实际上,如果操作系统不这样做,那真的很蹩脚
    【解决方案3】:

    Python 不缓存,操作系统有。您可以通过top 了解这些缓存的大小。在第三行,它会说:

    Mem:   5923332k total,  5672832k used,   250500k free,    43392k buffers
    

    这意味着操作系统正在使用大约 43MB 来缓存最近写入硬盘或从硬盘读取的数据。您可以通过将23 写入/proc/sys/vm/drop_caches 来关闭此缓存。

    【讨论】:

      猜你喜欢
      • 2012-03-27
      • 2021-06-12
      • 2018-07-23
      • 2012-01-07
      • 2023-03-09
      • 2011-02-11
      • 1970-01-01
      • 2018-06-21
      • 2019-12-09
      相关资源
      最近更新 更多