История изменений
Исправление Tanger, (текущая версия) :
Создать индекс: номер строки → позиция в файле, по нему выбирать.
Поддерживаю. Только как это нормально сделать?
Наговноскриптил такое.
#!/bin/bash
# usage ./createIndex <data_file> <index_file>
FILE=$1
INDEXFILE=$2
grep -Enra --byte-offset "^" $FILE | grep -Eao "^[0-9]*:[0-9]*" | awk -F':' '{ printf("%.18d:%.20d\n", $1, $2); }' > $INDEXFILE
#!/bin/bash
# usage ./getLine <data_file> <index_file> <linenum>
FILE=$1
INDEXFILE=$2
LINENUM=$[ $3 - 1 ];
L_OFFSET=$[ $LINENUM * 40 + 1 ];
OFFSET="$(tail -c +$L_OFFSET $INDEXFILE | head -n 1 | awk -F':' '{print $2 + 1;}')"
tail -c +$OFFSET $FILE | head -n 1
Проверил на больших (1.5G) бинарных файлах.
~ $ time head -n 2904776 data.binary | tail -n 1 # SSD
o_2~R.96`ÑæÄkO<Óié2CýT
real 0m0.477s
user 0m0.393s
sys 0m0.376s
$ time sed -n 2904776p data.binary
o_2~R.96`ÑæÄkO<Óié2CýT
real 0m0.731s
user 0m0.544s
sys 0m0.188s
$ time ./getLine data.binary lines.txt 2904776
o_2~R.96`ÑæÄkO<Óié2CýT
real 0m0.011s
user 0m0.004s
sys 0m0.014s
Исходная версия Tanger, :
Создать индекс: номер строки → позиция в файле, по нему выбирать.
Поддерживаю. Только как это нормально сделать?
Наговноскриптил такое.
#!/bin/bash
# usage ./createIndex <data_file> <index_file>
FILE=$1
INDEXFILE=$2
grep -Enra --byte-offset "^" $FILE | grep -Eao "^[0-9]*:[0-9]*" | awk -F':' '{ printf("%.18d:%.20d\n", $1, $2); }' > $INDEXFILE
#!/bin/bash
# usage ./getLine <data_file> <index_file> <linenum>
FILE=$1
INDEXFILE=$2
LINENUM=$[ $3 - 1 ];
L_OFFSET=$[ $LINENUM * 40 + 1 ];
OFFSET="$(tail -c +$L_OFFSET $INDEXFILE | head -n 1 | awk -F':' '{print $2 + 1;}')"
tail -c +$OFFSET $FILE | head -n 1
Проверил на больших (1.5G) бинарных файлах.
~ $ time head -n 2904776 data.binary | tail -n 1 # SSD
o_2~R.96`ÑæÄkO<Óié2CýT
real 0m0.477s
user 0m0.393s
sys 0m0.376s
$ time ./getLine data.binary lines.txt 2904776
o_2~R.96`ÑæÄkO<Óié2CýT
real 0m0.011s
user 0m0.004s
sys 0m0.014s