Swift FileHandle производительность поиска / чтения данных - PullRequest
0 голосов
/ 12 ноября 2018

Контекст:

У меня есть проект, где я храню много данных в двоичных файлах и файлах данных. Я получаю смещения в двоичном файле, хранящемся как UInt64, и каждое из этих смещений дает мне позицию строки в кодировке utf-8 в другом файле.

Я пытаюсь, учитывая все смещения, восстановить все строки из файла utf-8. Файл, содержащий все строки, имеет размер ровно 20437 байт / около 177000 строк.

Предполагая, что я уже восстановил все смещения, и теперь мне нужно перестраивать каждую строку по одной. У меня также есть длина в байтах каждой строки.

Метод 1:

Я открываю FileHandle, установленный для кодированного файла utf8, и для каждого смещения I seek к смещению и выполняю readData(ofLength:), вся операция очень длинная ... Более 35 секунд.

Метод 2:

Я инициализирую Data объект с Data(contentsOf: URL). Затем я выполняю Data.subdata(in: Range) для каждой строки, которую я хочу построить. Диапазон начинается от смещения и заканчивается на смещение + размер. Это загрузит весь файл в ОЗУ и позволит мне извлечь байты, которые мне нужны для каждой строки. Это намного быстрее, чем первый вариант, но, вероятно, так же плохо с точки зрения производительности.

Как я могу получить лучшую производительность для этой конкретной задачи?

1 Ответ

0 голосов
/ 03 июня 2019

Недавно я прошел через аналогичный опыт при кэшировании / загрузке двоичных данных на / с диска.

Я не уверен, что конечный процесс для достижения максимальной производительности, но вы можете еще улучшить производительность метода 2,используя «кусочек» объекта данных вместо data.subdata ().Это похоже на использование срезов массива.

Это, вероятно, потому, что вместо создания большего количества объектов данных с КОПИЯМИ исходных данных, данные, возвращаемые из среза, используют исходный объект данных в качестве ссылки.Это имело для меня большое значение, так как мои исходные данные были довольно большими.Вы должны профилировать оба метода и посмотреть, если это делает для вас заметным.

https://developer.apple.com/documentation/foundation/data/1779919-subscript

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...