Я обрабатываю большие файлы, где для подсчета количества строк в файле потребовалось несколько секунд.
Я придумал более сложное, но более быстрое решение:
- отобразить содержимое файла в виртуальную память, используя NSData. Это самый быстрый способ чтения большого файла на OS X и iOS. Он будет загружен в ОЗУ, если это файл малого / среднего размера, но большие файлы будут загружены в ОЗУ только частично.
- используя централизованную диспетчеризацию, запустите фоновую задачу, чтобы обработать данные кусками по 10 КБ, подсчитав, сколько строк найдено.
- запустить еще одну грандиозную центральную диспетчерскую задачу для анализа того же
NSData
объекта.
- всякий раз, когда запускается новый тег, каждые полсекунды проверяют, завершился ли подсчет строк, и если да, то обновляется индикатор выполнения.
Отображение файла в виртуальную память и последующий поиск байтов новой строки примерно в 10 раз быстрее, чем любой другой метод, который я смог найти, включая некоторые варианты выбора низкого уровня C. Мне понадобится доля секунды, чтобы подсчитать файл с 3 миллионами строк на моем оборудованном SSD Mac.
Выполнение этого в фоновом потоке, параллельно с NSXMLParser
на том же объекте NSData
, гарантирует, что файл не будет считан с диска дважды (если файл не слишком велик для размещения в ОЗУ).
Исходный код для этого здесь: https://github.com/abhibeckert/Speed-Limit/blob/master/Speed%20Limit/SLOSMImporter.m
Примечание: код, который я разместил, будет работать на iOS 7 и OS X 10.9. Это было только проверено на OS X 10.9. Его можно довольно легко модифицировать для работы с более старыми версиями SDK, просто соберите его, и ошибки компиляции должны легко исправляться.