我有一个包含超过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];
答案 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)
我不确定“替代方法”是什么意思,但如果你有一个庞大的数据集,另一种方法对你没有帮助。什么可以帮助您优化当前的加载过程
您可以执行以下操作:
更新:
您没有说该文件仍保留在设备的资源文件夹中,并且无法更改(例如从外部源下载)。如果是这种情况,请使用progrmr
解决方案。