Python:高效快速地编写大型文本文件的方法

5
我有一个关于Python速度/效率的问题:
我需要编写大量非常大的R数据框文件,大小约为0.5-2 GB。这基本上是一个大的制表符分隔表,其中每行可能包含浮点数、整数和字符串。
通常情况下,我会将所有数据放入NumPy数据框中,并使用np.savetxt保存它,但由于存在不同的数据类型,它无法真正放入一个数组中。
因此,我已经简单地手动组装了这些行作为字符串,但这有点慢。到目前为止,我的步骤是:
1) 将每行组装成字符串 2) 连接所有行成单个巨大的字符串 3) 将字符串写入文件
我有几个问题:
1) 大量字符串连接最终需要花费很多时间 2) 我的内存不足以保留所有字符串 3) ...这反过来又导致更多的单独的file.write命令,这也非常慢。
所以我的问题是:这种问题的好例程是什么?它平衡了速度与内存消耗,实现了最有效的字符串连接和写入磁盘。
...或者也许这个策略只是不好,我应该做完全不同的事情?
感谢您的帮助!

为什么不在有数据时将每个数据位直接写入文件呢?似乎没有必要将所有这些字符串连接起来。写操作会自动缓冲以便传输到磁盘。 - Michael Mior
当多次调用file.write而不是只调用一次时,速度似乎会大幅下降 - 但也许我错了? - Misconstruction
除非您发布您的代码,否则人们可能无法提供更多帮助。 - Michael Mior
3个回答

7
似乎Pandas可能是解决这个问题的好工具。使用Pandas很容易入门,并且它能很好地处理大多数将数据导入Python的方式。Pandas能够很好地处理混合数据(浮点数、整数、字符串),通常可以自动检测类型。一旦你在Pandas中有了一个(类似于R的)数据框,将框架输出到CSV就非常简单了。
DataFrame.to_csv(path_or_buf, sep='\t')

除了下面提到的配置之外,您还可以进行其他配置,以使您的制表符分隔文件更加完美。

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_csv.html


我从来没有尝试过使用Pandas,所以我会试一试。然而,在某些情况下,实际的文本文件可能比数据框更乱一些。 - Misconstruction
1
@Misconstruction,如果这个回答解决了你的问题,请用勾号标记为已解决。 - Joan Smith

5

除非你遇到了性能问题,否则你可以逐行向文件写入内容。Python 内部使用缓冲区,在性能和内存效率之间会给出一个不错的折中方案。

Python 缓冲与操作系统缓冲不同,你可以通过在打开文件时设置 buffering 参数来指定缓冲方式。


你如何设置缓冲参数? - Misconstruction
open("foo", "wb", 1024) 将设置一个1k缓冲区。0和1具有特殊含义。 - Clarus
你通常不需要手动设置缓冲区的大小。默认值大多数情况下都能很好地工作。 - Michael Mior

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接