如何快速解析大型ASCII文件以匹配记录?


1

我有很多包含数据记录的文件,存储为以空格分隔的ASCII文件。每条记录都是一个包含数字数据的行,其中一些列为整数,其他列为浮点数。

1 1  5711  4 22280.365035   75.917899   55.485326    4.0260    3.9460    1.7921   11.2400    0.0000    2.6735   54.7331   52.7375

我想根据简单的标准(第2列== 1,第6列> = 53.275等)解析这些数据,并将匹配的记录转储到另一个文件。

每个文件大小约为1GB,对应于~9M记录。目前我有一些逐行运行的MATLAB代码,但这需要很长时间(每个文件约2小时)。我使用MATLAB的唯一原因就是我将在以后处理数据。

如何更有效地解析/处理此问题?是否值得使用“适当”的语言,或者我不太可能看到显着的速度提升?

Answers:


0

一个简单的Python脚本可能比你在bash中做的任何事情都要快。例如:

#!/usr/bin/python

with open("data") as data:
    with open("filtered", "w") as filtered:
        for row in data:
            values = row.split()
            if (int(values[1]) == 1) and (float(values[5]) >= 53.275):  # [1]
                filtered.write(row)

[1]:索引在python中是从零开始的,所以 values[1]values[5] 分别是第二和第六列。

如果不确切地知道你的数据是什么样子以及它与你的过滤器有多大匹配,就不可能正确地进行测试,但对于几个快速合并的样本文件,我得到以下结果:

data_1   1000000 rows       35 matching rows   1.5 seconds
data_2   1000000 rows   565722 matching rows   3.1 seconds

我目前没有在Bash工作,代码是用MATLAB编写的(我编辑了我的OP以使其更清晰,对不起!)。您的代码片段基本上就是我正在做的事情,但从结果来看,它显然要快得多!我猜这个庞然大物的MATLAB有多少......这并不奇怪......
user265560
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.