После тестирования моего приложения с Инструментами я понял, что текущий синтаксический анализатор CSV, который я использую, имеет огромный объем потребляемой памяти. У кого-либо есть рекомендация для одной с низким объемом потребляемой памяти?
Возможно, вам следует делать это построчно, а не читать весь файл, разбирать его и возвращать массив со всеми строками. В любом случае, код, на который вы ссылаетесь, создает миллионы временных объектов в цикле, что означает очень большие затраты памяти.
Быстрым решением будет создание NSAutoreleasePool в конце цикла, и слив его в конце:
while ( ![scanner isAtEnd] ) {
NSAutoreleasePool *innerPool = [[NSAutoreleasePool alloc] init];
... куча кода...
[innerPool drain];
}
Это уничтожит временные объекты, поэтому объем памяти будет равен размеру данных, плюс объект для каждой строки в файле (примерно 8 байт * строки * столбцы)
Можно попробовать и другие парсеры CSV:
Вы можете поэкспериментировать, чтобы увидеть, не снижает ли какой-либо из них накладные расходы на память.
Ни один из них не поддерживает синтаксический анализ "на основе событий". При синтаксическом анализе на основе событий вы никогда не загружаете в память весь исходный файл, а достаточно для чтения текущей строки (вы также можете сделать это в процессе загрузки). Вы должны обрабатывать каждую строку по мере ее чтения и убедиться, что все данные из источника освобождены между строками.
Это будет теоретически решение с наименьшими накладными расходами. Если вам действительно нужны низкие накладные расходы, вам следует адаптировать для этого существующее решение (у меня нет никаких советов, как это сделать).
Это не анализатор CSV, но моя структура Cocoa ParseKit с открытым исходным кодом имеет мощный / удобный / настраиваемый строковый токенизатор, который может быть полезен для CSV или других типов синтаксического анализа / токенизации.
Фреймворк:
Некоторая документация по использованию:
http://parsekit.com/tokenization.html
Класс PKTokenizer:
http: / /github.com/itod/parsekit/blob/master/include/ParseKit/PKTokenizer.h http://github.com/itod/parsekit/blob/master/src/PKTokenizer.m