文件的大小是否会影响Python中的写入性能?
文件的大小是否会影响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。
文件的大小是否会影响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写入性能的几种方法。通过分析时间、逐行计时和执行频率以及查找内存泄漏,可以找到性能问题的原因并进行相应的优化。
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写入性能的影响以及解决方法的总结。