1

在我的应用程序中,我收到一个CSV包含 30,000 个对象的文件,每个对象总是有 24 个值(总共 720,000 个值)。

格式是这样的:

object1,value1,value2,...,value24
object2,value1,value2,...,value24
...
objectn,value1,value2,...,value24

当我解析这个文件时,我将每一行转换NSArrayNSString. 接下来,我对数组的每个值执行以下操作:

  1. 转换NSStringfloat使用- (float)floatValue
  2. 转换floatNSNumber
  3. 存储NSNumber在一个NSMutableArray

这个过程需要几秒钟,Instruments Time Profiler我在第 2 步和第 3 步中花费了 3.5 秒来获取 720,000 个值。

我怎样才能避免NSNumber翻译?我可以使用 C 风格的数组[]吗?或者CFMutableArrayRef?如果有帮助,我知道每个对象总是有 24 个值。

谢谢您的帮助,

塞巴斯蒂安。

4

2 回答 2

1

根据您以后计划如何使用这些值,有不同的方法。

  1. 将整个浮点数组存储为单个 NSValue。优点:施工速度提高 24 倍。缺点:您必须提取所有项目才能访问其中任何一个。
  2. 将值保存为字符串。优点:没有浪费时间。缺点:频繁访问会浪费时间。
  3. 设计一个保持单一记录的类:一个 NSString 和 24 个浮点属性。优点:单一记录规则一切。缺点:单一记录规则一切。

upd:如果您认为手动命名 24 个字段不方便value1..value24在案例 3 中,请随时在类的接口部分声明公共数组。这会将记录对象的原生性与 c 样式数组结合起来。您还可以向该类添加-[valueAtIndex:]和方法并使真正的数组私有。-[setValue:atIndex:]

于 2013-05-04T21:23:30.400 回答
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当你完成它时,你需要从中释放内存。

于 2013-05-05T07:43:29.783 回答