Я хочу минимизировать использование памяти при записи данных в файл CSV.
Для больших таблиц он использует больше памяти, даже если это временно.
Может кто-нибудь подсказать, как уменьшить использование памяти?
Может быть, я мог бы разделить действие для больших таблиц, написать больше файлов и затем объединить их, но я еще не пробовал, может быть, я упускаю что-то очевидное.
Вот код, используемый в настоящее время:
@autoreleasepool {
NSOutputStream *csvStream = [[NSOutputStream alloc] initToMemory];
[csvStream open];
CHCSVWriter *writer = [[CHCSVWriter alloc] initWithOutputStream:csvStream encoding:NSUTF8StringEncoding delimiter:';'];
NSArray *keySortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES]];
if (writeHeader==YES) {
//> write header
NSMutableDictionary *firstRow = [[self sharedUploadManager].modifiedRows firstObject];
if (firstRow==nil) {
result = NO;
return result;
}
NSArray *orderedKeys = [[firstRow allKeys] sortedArrayUsingDescriptors:keySortDescriptors];
for (NSString *columnName in orderedKeys) {
[writer writeField:columnName];
}
}
[writer finishLine];
@autoreleasepool {
//> write the rows
for (NSMutableDictionary *row in [self sharedUploadManager].modifiedRows) {
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];
}
}
[writer closeStream];
NSData *buffer = [csvStream propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
NSString *output = [[NSString alloc] initWithData:buffer encoding:NSUTF8StringEncoding];
if (![[NSFileManager defaultManager] fileExistsAtPath:csvPath]) {
[[NSFileManager defaultManager] createFileAtPath:csvPath contents:nil attributes:nil];
}
BOOL res = [[output dataUsingEncoding:NSUTF8StringEncoding] writeToFile:csvPath atomically:NO];
if (!res) {
NSLog(@"Error Creating CSV File path = %@", csvPath);
} else{
NSLog(@"Data saved! File path = %@", csvPath);
}
}
Я тоже пробовал эту логику раньше - немного чище, но с тем же результатом:
NSOutputStream *csvStream = [[NSOutputStream alloc] initToFileAtPath:csvPath append:YES];
[csvStream open];
CHCSVWriter *writer = [[CHCSVWriter alloc] initWithOutputStream:csvStream encoding:NSUTF8StringEncoding delimiter:';'];
if (writeHeader==YES) {
//> write header
NSMutableDictionary *firstRow = [rows firstObject];
if (firstRow==nil) {
result = NO;
return result;
}
NSArray *orderedKeys = [[firstRow allKeys] sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES]]];
for (NSString *columnName in orderedKeys) {
[writer writeField:columnName];
}
[writer finishLine];
}
//> write the rows
for (NSMutableDictionary *row in rows) {
NSArray *orderedKeys = [[row allKeys] sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES]]];
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];
}
[writer closeStream];