Как читать текстовые блоки из огромного текстового файла? - PullRequest
2 голосов
/ 20 сентября 2011

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

Так что кто-нибудь, пожалуйста, пришлите мне пример кода, чтобы я получил чанки в соответствии с моим требованием.только один.пожалуйста, ответьте как можно скорее.

Ответы [ 2 ]

14 голосов
/ 20 сентября 2011

Полагаю, это приложение для iOS.В этом случае вы, вероятно, достигнете предела памяти, вызвав contentsOfFile:, потому что этот метод пытается прочитать все содержимое файла в переменную (память).Помните, что на iOS ваше приложение должно играть хорошо, и если оно решит использовать слишком много памяти, процесс сторожевого таймера убьет ваше приложение, чтобы спасти устройство от перезагрузки (что происходит из-за того, что на устройствах iOS нет диска для подкачки).

Вы смотрели на NSFileHandle?NSFileHandle поддерживает поиск в текстовом файле.С помощью простой итерации вы можете использовать следующие методы для поиска в файле и чтения фрагментов данных:

- (NSData *)readDataOfLength:(NSUInteger)length;
- (void)seekToFileOffset:(unsigned long long)offset;

Это может выглядеть примерно так.Предположим, pathToFile - это NSString, содержащий путь к текстовому файлу, который нужно прочитать.

uint64 offset = 0;
uint32 chunkSize = 1024;     //Read 1KB chunks.
NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:pathToFile];
NSData *data = [handle readDataOfLength:chunkSize];

while ([data length] > 0)
{
     //Make sure for the next line you choose the appropriate string encoding.
     NSString *dataString = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];

     /* PERFORM STRING PROCESSING HERE */

     /* END STRING PROCESSING */
     offset += [data length];

     [handle seekToFileOffset:offset];
     data = [handle readDataOfLength:chunkSize];
}

[handle closeFile];
1 голос
/ 20 сентября 2011

Хорошая идея - взглянуть на источник textedit, потому что я уже открывал с ним огромные файлы, и должен быть способ сделать это. Не уверен, почему ваше приложение падает, хотя. Это не должно иметь проблемы.

...