文件的大小是否会影响Python中的写入性能?

11 浏览
0 Comments

文件的大小是否会影响Python中的写入性能?

我试图使用Python向文件写入大约50亿行。我注意到随着文件越来越大,写入性能越来越差。\n例如,开始时我每秒写入1000万行,但在30亿行后,写入速度变慢了10倍。\n我想知道这是否与文件大小有关?\n也就是说,如果我将这个大文件分成更小的文件,性能会变好,还是文件大小不会影响写入性能?\n如果你认为它影响性能,能否请你解释一下原因?\n--更多信息--\n内存消耗始终相同(1.3%)。每行的长度相同。逻辑是从文件A中读取一行(称为A文件),A文件的每一行包含两个以制表符分隔的值,如果其中一个值具有特定的特征,则将相同的行添加到文件B中。这个操作是O(1)的,我只是将值转换为整数并检查该值%某个数是否是我想要的7个标志之一。\n每当我从文件A中读取1000万行时,我输出行号。(这就是我知道性能下降的方式)。文件B变得越来越大,向其写入的速度变慢。\n操作系统是Ubuntu。

0
0 Comments

文件的大小是否会影响Python中的写入性能?

在3十亿行后,您遇到了性能崩溃,并且内存始终保持相同(1.3%)!正如其他人所提到的,Python的I/O代码中没有任何会根据文件大小影响性能的问题。所以这可能是由于软件问题(操作系统)或硬件问题引起的!为了解决这个问题,我建议以下几种方法:

1. 使用"time python yourprogram.py"命令来分析您的时间,它会显示以下结果:

- real - 实际经过的时间

- user - 在内核外花费的CPU时间

- sys - 在内核特定函数内花费的CPU时间

详细了解"real"、"user"、"sys"可以参考ConcernedOfTunbridgeWells在StackOverflow上的回答。

2. 使用分析器进行逐行计时和执行频率,line_profiler是一种简单且不显眼的代码分析工具,可以用来查看脚本中每行代码运行的速度和频率。可以通过pip安装line_profiler。

3. 最后也是最重要的一种方法是找出内存泄漏的位置。CPython解释器使用引用计数作为其主要方法来跟踪内存。这意味着每个对象都包含一个计数器,当对象的引用存储在某个地方时,计数器会递增,当对它的引用被删除时,计数器会递减。当计数器达到零时,CPython解释器知道该对象不再使用,所以会删除对象并释放占用的内存。如果即使对象不再使用,仍然保持对它的引用,可能会导致内存泄漏。可以使用一个名为objgraph的工具来查找这些"内存泄漏",它可以显示内存中的对象数量,并定位代码中保持对这些对象引用的不同位置。可以通过pip安装objgraph,并在代码中插入一个调用调试器的语句来使用它。

以上是解决文件大小影响Python写入性能的几种方法。通过分析时间、逐行计时和执行频率以及查找内存泄漏,可以找到性能问题的原因并进行相应的优化。

0
0 Comments

文件大小对Python写入性能的影响是由文件系统驱动程序引起的。如果你正在使用的文件系统对大文件有问题,那么你需要检查的代码是文件系统驱动程序。为了解决这个问题,你可以尝试在你的平台上使用不同的文件系统(但这不再是一个编程问题,因此不适合在StackOverflow上讨论)。如果你的问题提到了你的操作系统和你正在写入的文件系统的类型,答案可以更具体。

0
0 Comments

Python中文件的大小是否会影响写入性能?

从以上的代码和输出结果来看,文件的大小确实会影响写入性能。较小的文件可以在较短的时间内完成写入,而较大的文件需要花费更长的时间。

出现这个问题的原因可能是操作系统的磁盘分配方式导致的。在OS X的HFS+和Linux的EXT4文件系统中,都采用了“写入时分配”的磁盘分配策略。Linux的EXT4文件系统还会主动移动文件以保持连续分配(无碎片)。

对于Linux的EXT4文件系统,可以使用fallocate预先分配较大的文件来减少这种影响。在Python中,可以使用文件指针重置的方法,将文件指针定位到开头并进行原地覆盖写入。

代码示例:

def preallocate_file(path, size):
    ''' Preallocate of file at "path" of "size" '''
    # use truncate or fallocate on Linux
    # Depending on your platform, You *may* be able to just the following
    # works on BSD and OS X -- probably most *nix:
    with open(path, 'w') as f:
        f.truncate(size)
preallocate_file(fn, size)
with open(fn, 'r+') as f:
    f.seek(0)        # start at the beginning 
    # write whatever
    f.truncate()     # erases the unused portion...

如果您希望更加高级一些,可以编写自己的上下文管理器来模拟`with open(...) as f:`的形式,但是需要额外接受一个参数来预先分配文件的大小。然后在退出上下文管理器时进行截断操作。

以上就是文件大小对Python写入性能的影响以及解决方法的总结。

0