Como faço para rapidamente analisar arquivos ASCII grandes para registros correspondentes?

1

Eu tenho muitos arquivos contendo registros de dados, armazenados como arquivos ASCII delimitados por espaço. Cada registro é uma linha contendo dados numéricos, com algumas colunas inteiras e outras com ponto flutuante, por exemplo.

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

Eu quero analisar esses dados com base em critérios simples (coluna 2 == 1, coluna 6 > = 53.275 etc.) e despejar os registros correspondentes em outro arquivo.

Cada arquivo tem ~ 1 GB de tamanho, correspondendo a ~ 9 milhões de registros. Atualmente eu tenho algum código MATLAB que o executa linha por linha, mas isso leva muito tempo (~ 2 horas por arquivo). A única razão pela qual eu estou usando o MATLAB é simplesmente o que eu vou processar os dados depois.

Como posso analisar / processar isso com mais eficiência? Vale a pena usar uma linguagem "adequada" para isso, ou é improvável que eu veja um aumento significativo de velocidade?

    
por user265560 21.10.2013 / 15:16

1 resposta

0

Um simples script Python provavelmente será mais rápido do que qualquer coisa que você possa fazer no bash. Por exemplo:

#!/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]: A indexação é baseada em zero em python, então values[1] e values[5] são a segunda e a sexta colunas, respectivamente.

É impossível testar corretamente sem saber exatamente como são seus dados e o quanto deles corresponde ao seu filtro, mas, para alguns arquivos de amostra rapidamente eliminados, obtenho estes resultados:

data_1   1000000 rows       35 matching rows   1.5 seconds
data_2   1000000 rows   565722 matching rows   3.1 seconds
    
por 21.10.2013 / 16:02