Я думаю, что ответом будет "да", вы читаете миллиарды строк, используя readLine
, если только вы не считаете, что стоит использовать либо
- стратегия, изложенная GregS, то есть оценка длины строки и использование ее для начала чтения где-то рядом с правильной строкой, или
вы используете отдельный индекс, либо в начале файла, либо в отдельном файле, который очень предсказуем и что-то вроде
0000001 000000001024
0000002 000000001064
0000003 000000002010
То есть номер строки и начальная позиция этой строки в байтах строго определенным образом, что позволяет определить положение индекса по чему-то вроде:
Я хочу прочитать строку 3, чтобы найти положение строки 3, перейдя в положение (3-1) * 20,
и прочитайте 0000003 000000002010
, проанализируйте и узнайте, что строка 3 находится в позиции байта 2010, найдите эту позицию и начните чтение.
Расчет или ведение индекса может оказаться непростым делом, если он находится в основном файле данных, поскольку это будет означать, что вы будете предварительно рассчитывать позиции перед тем, как на самом деле будете писать файл. Я думаю, что я использовал бы отдельный файл индекса и либо вычислял бы индексы во время записи, либо имел бы отдельную утилиту для создания файла индекса на основе файла данных.
РЕДАКТИРОВАТЬ Добавлен пример кода для демонстрации моего предложения
Я создал небольшой скрипт на Python, который читает файл данных и создает индексный файл. Индексный файл содержит положение строки в файле данных и предназначен для удобного поиска.
Этот пример сценария имеет форматирование индекса 06d, что достаточно для файлов с 999,999 строк данных, для вас его, возможно, придется настроить (не забудьте INDEX_LENGTH). Он создает индексный файл и использует этот индексный файл для считывания заданной строки из файла данных (в демонстрационных целях; для этой части вы бы использовали java :)
Сценарий называется так:
python create_index.py data.txt data.idx 3
мой пример файла данных:
#1{1,12,345,867}
#2{123, 3243534, 2132131231}
#3{234, 35345}
#4{}
и сам скрипт:
import sys
# Usage: python this_script.py datafile indexfile lineno
# indexfile will be overwritten
# lineno is the data line which will be printed using the
# index file, as a demonstration
datafilename= sys.argv[1]
indexfilename = sys.argv[2]
lineno = int(sys.argv[3])
# max 999999 lines in this format
format = "%06d\n"
INDEX_LENGTH = 6+1 # +1 for newline
def create_indexfile():
indexfile = open(indexfilename, "wB")
# Print index of first line
indexfile.write(format % 0)
f = open(datafilename, "rB")
line = f.readline()
while len(line) > 0:
indexfile.write( format % f.tell() )
line = f.readline()
f.close()
indexfile.close()
# Retrieve the data of 1 line in the data file
# using the index file
def get_line():
linepos = INDEX_LENGTH * (lineno - 1)
indexfile = open(indexfilename, "rB")
indexfile.seek(linepos)
datapos = int(indexfile.readline())
indexfile.close()
datafile = open(datafilename, "rB")
datafile.seek(datapos)
print datafile.readline()
datafile.close()
if __name__ == '__main__':
create_indexfile()
get_line()
Файл индекса необходимо перестроить после изменения файла данных. Вы можете проверить, правильно ли вы прочитали данные, сравнив номер строки из прочитанных данных (# 3 {...}) с номером строки ввода, так что это довольно безопасно.
Независимо от того, выберете ли вы его или нет, я думаю, что пример довольно прост и легок.