如何使用iOS快速save/load200,000个double类型存入内存?
How to Quickly save/load 200,000 of double type into memory using iOS?
我尝试使用 NSKeyedArchiver save/load 具有 200,000 个双精度值的数值数据。保存大约需要 160 秒,加载需要 1900 秒。
当我改用Core Data时,它更慢了。
但是我在 iOS 中找不到未加密的归档程序。代码如下:
VectorWeights::iterator wit;
for ( wit=m_Weights.begin(),ind=0; wit<m_Weights.end(); wit++,ind++ )
{
[archiver encodeObject:[[NNW alloc] initWithNNWeight:*wit] forKey:[[NSString alloc] initWithFormat:@"%@_W%ld",label,ind]];
}
NNW 编码器如下:
@implementation NNW
- (void)encodeWithCoder:(NSCoder *)coder
{
[coder encodeObject:self.internal->label forKey:NNWid];
[coder encodeDouble:self.internal->value forKey:NNWvalue];
}
有没有更好的方法呢?
更新:标签是 NString* 类型,VectorWeight 是 std::vector
为什么不创建一个 NSMutableData 对象,让它足够大 (200000 * sizeof (double)),获取一个指向字节的指针,将 200000 双倍的 memcpy 到其中,并将其保存到文件中。应该明显少于 100 毫秒。
或者只是
double* p = malloc (200000 * sizeof (double));
... fill with 200,000 double values
NSData* data = [NSData dataWithBytesNoCopy:p length: 200000 * sizeof (double)];
[data writeToURL:someURL atomically:YES];
我尝试使用 NSKeyedArchiver save/load 具有 200,000 个双精度值的数值数据。保存大约需要 160 秒,加载需要 1900 秒。
当我改用Core Data时,它更慢了。
但是我在 iOS 中找不到未加密的归档程序。代码如下:
VectorWeights::iterator wit;
for ( wit=m_Weights.begin(),ind=0; wit<m_Weights.end(); wit++,ind++ )
{
[archiver encodeObject:[[NNW alloc] initWithNNWeight:*wit] forKey:[[NSString alloc] initWithFormat:@"%@_W%ld",label,ind]];
}
NNW 编码器如下:
@implementation NNW
- (void)encodeWithCoder:(NSCoder *)coder
{
[coder encodeObject:self.internal->label forKey:NNWid];
[coder encodeDouble:self.internal->value forKey:NNWvalue];
}
有没有更好的方法呢?
更新:标签是 NString* 类型,VectorWeight 是 std::vector
为什么不创建一个 NSMutableData 对象,让它足够大 (200000 * sizeof (double)),获取一个指向字节的指针,将 200000 双倍的 memcpy 到其中,并将其保存到文件中。应该明显少于 100 毫秒。
或者只是
double* p = malloc (200000 * sizeof (double));
... fill with 200,000 double values
NSData* data = [NSData dataWithBytesNoCopy:p length: 200000 * sizeof (double)];
[data writeToURL:someURL atomically:YES];