在我的应用程序中,我收到一个包含30,000个对象的CSV
文件,每个对象总共有24个值(总共720,000个值)。
格式是这样的:
object1,值1,值2,...,value24
对象2,值1,值2,...,value24
...
objectn,value1,value2,...,value24
当我解析此文件时,我会转换NSArray
NSString
中的每一行。
接下来,我为数组的每个值执行以下操作:
NSString
float
转换为- (float)floatValue
float
转换为NSNumber
NSNumber
存储在NSMutableArray
此过程需要几秒钟,而Instruments Time Profiler
我在第2步和第2步花费3.5秒3为720,000个值。
如何继续避免NSNumber
翻译?我可以使用C样式数组,例如[]
吗?还是CFMutableArrayRef
?如果它有帮助,我知道每个对象总有24个值。
感谢您的帮助,
塞巴斯蒂安。
答案 0 :(得分:1)
根据您以后计划如何使用这些值,有不同的方法。
upd:如果您想到在案例3中手动命名24个字段value1
.. value24
的不便,请随意在类的接口部分声明公共数组。这将记录对象的诞生与c风格的数组相结合。您还可以向该类添加-[valueAtIndex:]
和-[setValue:atIndex:]
方法,并将实数数组设为私有。
答案 1 :(得分:0)
就个人而言,我只使用C风格的数组。如果要逐行处理数据,可以使用表示每行的对象,如下所示:
@interface Row : NSObject {
float values[24];
}
@end
然后为每行创建 Row 实例,直接设置24个值,并将实例添加到NSMutableArray。
Row *row = [[[Row alloc] init] autorelease];
// here's where you read in the data for the row and save the 24 values
row.values[0] = ...
...
row.values[23] = ...
// and here you add the Row instance to an NSMutableArray
[rows addObject:row];
否则,如果你事先知道你会预期30,000行,那么你可以预先分配一个30,000 x 24的浮点阵列。
float *rows = calloc(30000*24, sizeof(float));
for (int i = 0; i < 30000; i++) {
float *values = rows[24*i];
// here's where you read in the data for row i and save the 24 values
values[0] = ...
...
values[23] = ...
}
不要忘记,当你完成它时,你需要释放calloc
的内存。