加载大型CSV文件时的性能问题(Objective-C)

时间:2011-11-10 20:22:00

标签: iphone objective-c csv

我有一个包含超过80,000行和100列的CSV文件。我正在尝试以最高性效的方式处理加载/访问CSV数据。现在我的CSVParser将数据加载到NSArray中,但它非常缓慢/缓慢;这是一个问题,因为我希望在移动设备上处理这种解析/加载:iPhone。

非常感谢对替代方法的任何建议。谢谢

更新:

为了将来的参考/讨论,我现在有以下尝试:

// Mark time the parser starts 
NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate];
// Parse the CSV file
[parser parse];
NSTimeInterval end = [NSDate timeIntervalSinceReferenceDate];

// Print how long the parsing took 
NSLog(@"raw difference: %f", (end-start));

// Copy the allLines array from the parsing delegate 
NSArray *allOfTheRows = [NSArray arrayWithArray:d.allLines]; 
NSLog( @"There are %i lines in the csv file", [allOfTheRows count]); 

NSFileManager *f = [[NSFileManager alloc] init]; 
NSString *filePath = @"/Users/..../rawData"; // This is of course not a literal location...

// Archive the array as NSData 
NSData *someData = [NSKeyedArchiver archivedDataWithRootObject:allOfTheRows];

// Write the data to a file
[f createFileAtPath:filePath contents:someData attributes:nil]; 

/*
 If I were to load the data from the iPhone, i'd copy the newly created someData file above to my application's mainBundle, and then unarchive the NSData to an array on the iPhone
*/
// Read the data back as an array 
NSData *readData = [NSData dataWithContentsOfFile:filePath]; 

NSArray *bigCollectionReadBack = [NSKeyedUnarchiver unarchiveObjectWithData:readData]; 

2 个答案:

答案 0 :(得分:4)

我在iPhone上进行CSV解析时遇到了类似的问题。我最终在Mac上进行解析并写出包含struct数据数组的二进制文件。过去需要120秒才能在iPhone 4上解析/加载CSV文件,但二进制文件的加载时间不到10毫秒。

编辑 - 再详细说明,在Mac上我read the CSV file,将数据组织成几个结构数组,然后使用{{3}将数据写入二进制文件}。在iOS上,我使用fwrite (一个读取标题以获取大小信息,第二个读取数据)读取二进制文件到正确大小的结构数组中。其中一个较大的文件是2.2MB,使用fread从闪存读入RAM需要66毫秒。

2011-11-15 17:32:35.304 -[BinFile initWithFile:] 001953f0 file Metro
2011-11-15 17:32:35.370 -[BinFile initWithFile:] read 2217385 bytes (Metro)

答案 1 :(得分:1)

我不确定“替代方法”是什么意思,但如果你有一个庞大的数据集,另一种方法对你没有帮助。什么可以帮助您优化当前的加载过程

您可以执行以下操作:

  1. 以块的形式加载文件,这样就不会破坏你的RAM(提示:NSFileHandle)
  2. 使用GCD处理多个线程上的解析(使用所有处理器内核)
  3. 如果您有任何确保使用ARP
  4. ,请避免自动释放对象

    更新:

    您没有说该文件仍保留在设备的资源文件夹中,并且无法更改(例如从外部源下载)。如果是这种情况,请使用progrmr解决方案。