如何在不使用大量内存的情况下导入包含Objective-C中许多小记录的大型文本文件

Set*_*nta 0 core-data objective-c ios

我需要能够将一些相当大的文本文件(100Mb +)导入到面向内存受限的移动设备的应用程序中的CoreData中.每个文件都包含大量小记录,这些记录在添加到数据库之前将被处理.通过许多来源,在文本文件中阅读的推荐方法似乎是:

NSString *stringFromFileAtPath = [[NSString alloc]initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
Run Code Online (Sandbox Code Playgroud)

乍一看,这似乎是一种非常耗费内存的方式来满足我的需求,但考虑到似乎没有其他推荐的方法来阅读文件,我会猜测Apple已经考虑到这一点并做了自己的记忆管理 - 可能只在必要时才从文件中导致数据错误?

如果不是,最好的方法是使用NSStream和NSScanner一次检索和处理一行文本?

如果推荐的方法确实能很好地处理内存,那么下一步通常是:

NSArray *lines = [stringFromFileAtPath componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];
Run Code Online (Sandbox Code Playgroud)

如果我使用这种方法,我假设它需要内存中的完整文本文件,所以再次它将是内存密集型.为了节省内存,我最好还是使用NSScanner,或者考虑到移动设备的处理能力有限(当然还有一些较旧的设备)需要永远完成吗?

在此先感谢您提供任何帮助,您可以向我提出这个问题.

戴夫

小智 5

内存映射文件可以是检查大文件内容的好方法.它看起来-[NSString initWithBytesNoCopy:length:encoding:freeWhenDone:]会让你创建一个直接NSString使用内存映射文件的内容作为字符串的值.

我必须承认,我没有使用过那个特定的功能,但是我的应用程序确实使用了内存映射文件,而且它们很容易上班.所以至少,你有一个简单的方法,不需要一次加载100MB的数据,但一次性加载100MB数据的便利性.

使用POSIX函数mmap将文件映射到内存.你需要一个POSIX文件句柄,我的代码来自open(在完成通常的歌曲和舞蹈之后,在包中获得正确文件名的UTF8副本),但也可以使用其中一个NS设施完成.