适用于iPhone的内存占用较少的CSV解析器

时间:2010-06-13 05:18:57

标签: iphone objective-c cocoa csv

在使用Instruments测试我的应用程序后,我意识到我使用的当前CSV parser具有巨大的内存占用。是否有人建议内存占用少的人?

3 个答案:

答案 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

一些使用文档:

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