Контекст:
У меня есть проект, где я храню много данных в двоичных файлах и файлах данных. Я получаю смещения в двоичном файле, хранящемся как UInt64
, и каждое из этих смещений дает мне позицию строки в кодировке utf-8 в другом файле.
Я пытаюсь, учитывая все смещения, восстановить все строки из файла utf-8. Файл, содержащий все строки, имеет размер ровно 20437 байт / около 177000 строк.
Предполагая, что я уже восстановил все смещения, и теперь мне нужно перестраивать каждую строку по одной. У меня также есть длина в байтах каждой строки.
Метод 1:
Я открываю FileHandle
, установленный для кодированного файла utf8, и для каждого смещения I seek
к смещению и выполняю readData(ofLength:)
, вся операция очень длинная ... Более 35 секунд.
Метод 2:
Я инициализирую Data
объект с Data(contentsOf: URL)
.
Затем я выполняю Data.subdata(in: Range)
для каждой строки, которую я хочу построить. Диапазон начинается от смещения и заканчивается на смещение + размер.
Это загрузит весь файл в ОЗУ и позволит мне извлечь байты, которые мне нужны для каждой строки. Это намного быстрее, чем первый вариант, но, вероятно, так же плохо с точки зрения производительности.
Как я могу получить лучшую производительность для этой конкретной задачи?