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

时间:2014-02-25 21:17:23

标签: python python-2.7 file-io dataframe string-concatenation

我有关于python的速度/效率相关问题:

我需要编写大量非常大的R dataframe-ish文件,大小约为0.5-2 GB。这基本上是一个大的制表符分隔表,其中每行可以包含浮点数,整数和字符串。

通常情况下,我只是将所有数据放在numpy数据帧中并使用np.savetxt来保存它,但由于存在不同的数据类型,因此无法将其放入一个数组中。

因此我只是简单地将线条组装成字符串,但这有点慢。到目前为止,我正在做:

1)将每一行组装成一个字符串 2)将所有行连接为单个巨大的字符串 3)将字符串写入文件

我有几个问题: 1)大量的字符串连接最终耗费大量时间 2)我运行RAM来保持内存中的字符串 3)......这反过来导致更多单独的file.write命令,这些命令也非常慢。

所以我的问题是:这类问题的常规是什么?一种平衡速度与内存消耗的方法,用于最有效的字符串连接和写入磁盘。

...或者这个策略可能只是坏事,我应该做一些完全不同的事情?

提前致谢!

3 个答案:

答案 0 :(得分:6)

似乎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

答案 1 :(得分:5)

除非遇到性能问题,否则您可以逐行写入文件。 Python内部使用缓冲,可能会在性能和内存效率之间做出很好的折衷。

Python缓冲与操作系统缓冲不同,您可以通过将buffering参数设置为open来指定缓冲内容的方式。

答案 2 :(得分:0)

我认为您可能想要做的是创建一个内存映射文件。请查看以下文档,了解如何使用numpy执行此操作:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.memmap.html