解析大型文件的有效方法

时间:2018-07-23 15:02:35

标签: python csv io

我必须解析一个很大的文件,修改其内容,然后将其写入另一个文件。我现在拥有的文件与可能的文件相比并没有那么大,但是仍然很大。

文件大小为1.3 GB,包含大约700万行这种格式的文件:

8823192\t/home/pcastr/...

\t是制表符。开头的数字是路径的明显大小。

我想要一个输出文件,其行如下所示(csv格式):

True,8823192,/home/pcastr/...

第一个值是路径是否为目录。

当前,我的代码如下所示:

with open(filepath, "r") as open_file:
    while True:
        line = open_file.readline()
        if line == "":  # Checks for the end of the file
            break
        size = line.split("\t")[0]
        path = line.strip().split("\t")[1]
        is_dir = os.path.isdir(path)

        streamed_file.write(unicode("{isdir},{size},{path}\n".format(isdir=is_dir, size=size, path=path))

需要注意的是,这样的文件将变得非常大,所以我不仅需要快速的解决方案,而且还需要内存有效的解决方案。我知道通常在这两种品质之间进行权衡,

3 个答案:

答案 0 :(得分:7)

最大的收益可能来自每行仅调用一次measure = CALCULATE( AVERAGEX( 'stores', 'stores'[some_value] ), FILTER( ALL('stores'), 'stores'[store_child_and_parent] in VALUES('store_relationship'[store_parent]) ) )

split

您至少可以通过将输入文件视为迭代器并使用size, path = line.strip().split("\t") # or ...split("\t", 3)[0:2] if there are extra fields to ignore 模块来简化代码。这也可能会提高您的速度,因为它不需要显式调用csv

split

答案 1 :(得分:0)

您可能需要mmap。简介和教程here

为简化起见,这意味着您可以将磁盘上的文件视为位于RAM中,而无需将整个文件实际读取到RAM中。

答案 2 :(得分:0)

在通过网络复制之前压缩文件可以加快数据处理速度,因为您可以更快地将数据保存到脚本中。

可以将输入文本文件压缩在远程目标系统上吗? 如果是,则可以使用python支持的算法(模块zlib,gzip,bz2,lzma,zipfile)将其压缩为一种格式

如果否,则至少可以在远程存储系统上运行脚本来压缩文件。 接下来,您将读取文件并使用python模块之一将其解压缩到内存中,然后处理每一行。