Classificar arquivos CSV grandes (90 GB), cota de disco excedida

5

Aqui está o que eu faço agora,

sort -T /some_dir/ --parallel=4 -uo file_sort.csv -k 1,3 file_unsort.csv

o arquivo tem 90GB, recebi esta mensagem de erro

sort: close failed: /some_dir/sortmdWWn4: Disk quota exceeded

Anteriormente, eu não usava a opção -T e, aparentemente, o diretório tmp não é grande o suficiente para lidar com isso. Meu diretório atual tem espaço livre de aproximadamente 200 GB. Ainda não é suficiente para o arquivo temporário de classificação?

Não sei se a opção paralela afeta as coisas ou não.

    
por Xuezhou Zhang 08.03.2017 / 18:34

1 resposta

4

O problema é que você parece ter uma cota de disco configurada e seu usuário não tem o direito de ocupar tanto espaço em /some_dir . E não, a opção --parallel não deve afetar isso.

Como solução alternativa, você pode dividir o arquivo em arquivos menores, classificar cada um deles separadamente e depois mesclá-los novamente em um único arquivo:

## split the file into 100M pieces named fileChunkNNNN
split -b100M file fileChunk
## Sort each of the pieces and delete the unsorted one
for f in fileChunk*; do sort "$f" > "$f".sorted && rm "$f"; done
## merge the sorted files    
sort -T /some_dir/ --parallel=4 -muo file_sort.csv -k 1,3 fileChunk*.sorted

A mágica é a opção -m do tipo GNU (de info sort ):

‘-m’
‘--merge’
    Merge the given files by sorting them as a group.  Each input file
    must always be individually sorted.  It always works to sort
    instead of merge; merging is provided because it is faster, in the
    case where it works.

Isso exigirá que você tenha ~ 180G livres para um arquivo 90G para armazenar todas as peças. No entanto, a classificação real não ocupará tanto espaço, pois você só estará classificando em blocos de 100 M.

    
por 08.03.2017 / 20:16