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设施完成.
| 归档时间: |
|
| 查看次数: |
2382 次 |
| 最近记录: |