Если вы не хотите использовать много памяти при создании большого файла CSV, не создавайте поток вывода на основе памяти. Создайте поток вывода в фактический файл. Тогда данные CSV будут записаны в файл, а не в память. Тогда файл может быть гигабайтным и использовать очень мало памяти.
Это дает дополнительное преимущество: нет необходимости обращаться к данным буфера, создавать из них строку (теперь удваивает использование памяти), а затем записывать строку в файл.
NSOutputStream *csvStream = [NSOutputStream outputStreamToFileAtPath:csvPath append:NO];
[csvStream open];
CHCSVWriter *writer = [[CHCSVWriter alloc] initWithOutputStream:csvStream encoding:NSUTF8StringEncoding delimiter:';'];
// write your CSV entries
[writer closeStream];
Вот и все. Никакого другого кода, необходимого для создания файла.
В дополнение к этим изменениям вам необходимо изменить место использования пула автоматического выпуска. Он должен быть внутри внешней петли for
.
//> write the rows
for (NSMutableDictionary *row in [self sharedUploadManager].modifiedRows) {
@autoreleasepool {
NSArray *orderedKeys = [[row allKeys] sortedArrayUsingDescriptors:keySortDescriptors];
for (NSString *key in orderedKeys ) {
NSString *field = [row objectForKey:key];
if ([field isKindOfClass:[NSNull class]]) {
[writer writeField:nil];
} else {
[writer writeField:field];
}
}
//> finish the line
[writer finishLine];
}
}
Это обеспечит очистку памяти автоматически освобожденных объектов после каждой строки.
Это странно действительно. Я проверил, что проблема также существует с VB.Net, таким образом, это не конкретный вопрос C#. Это должно будет быть подтверждено базовой командой отладчика, но это действительно похоже на ошибку.
Зарегистрируйте ошибку на Подключении и отправьте число ошибки как комментарий к моему OP так, чтобы я мог удостовериться, что это направляется корректной команде.
Это - известная проблема, которая вызывается ошибкой в CLR. Это было зафиксировано в CLR 4.0 (пока еще невыпущенный).
Благодаря JaredPar для помощи с этим. См. комментарии к его ответу для большего количества детали и ссылке на исходный отчет об ошибках на Microsoft Connect.