在使用Instruments测试我的应用程序后,我意识到我使用的当前CSV parser具有巨大的内存占用。是否有人建议内存占用少的人?
答案 0 :(得分:5)
您可能应该逐行执行此操作,而不是读取整个文件,解析它,并返回包含其中所有行的数组。在任何情况下,您链接的代码都会在循环中产生数以万计的临时对象,这意味着它将具有非常高的内存开销。
快速解决方法是在循环的顶部创建一个NSAutoreleasePool,并将其排到底部:
while ( ![scanner isAtEnd] ) {
NSAutoreleasePool *innerPool = [[NSAutoreleasePool alloc] init];
......一堆代码......
[innerPool drain];
}
这会消灭临时对象,因此你的内存使用量将是数据的大小,加上文件中每个字符串的对象(大约8个字节*行*列)
答案 1 :(得分:3)
还有一些其他CSV解析器可供尝试:
您可以尝试查看是否有较低的内存开销。
这些都不支持“基于事件”的解析。在基于事件的解析中,您永远不会将整个源文件加载到内存中,只需要足够的文件来读取当前行(您也可以在下载时进行此操作)。您必须在读取每一行时处理它们,并确保源中的所有数据都在行之间释放。
这将是理论上最低的开销解决方案。如果你真的需要低开销,你应该调整现有的解决方案来做到这一点(我对如何做到这一点没有任何建议。)
答案 2 :(得分:0)
它不是一个CSV解析器,但我的开源Cocoa ParseKit框架有一个功能强大/方便/可配置的字符串标记器,可以方便CSV或其他类型的解析/标记。
框架:
一些使用文档:
http://parsekit.com/tokenization.html
PKTokenizer类:
http://github.com/itod/parsekit/blob/master/include/ParseKit/PKTokenizer.h http://github.com/itod/parsekit/blob/master/src/PKTokenizer.m