我目前正在使用Swift在iOS上存储一些数据。这些值是一个二维整数数组,定义为[[Int]].我需要将这些整数数组保存到磁盘中。目前,我正在使用以下功能来做到这一点:
func writeDataToFile(data: [[Int]], filename: String){
let fullfile = NSString(string: self.folderpath).stringByAppendingPathComponent(filename+".txt")
var fh = NSFileHandle(forWritingAtPath: fullfile)
if fh == nil{
NSFileManager.defaultManager().createFileAtPath(fullfile, contents: nil, attributes: nil)
fh = NSFileHandle(forWritingAtPath: fullfile)
}
fh?.writeData("Time: \(filename)\n".dataUsingEncoding(NSUTF16StringEncoding)!)
fh?.writeData("\(data)".dataUsingEncoding(NSUTF16StringEncoding)!)
fh?.closeFile()
}目前,该函数运行良好,但它生成的文件相对较大(每个文件为1.1mb--当您以1Hz编写这些文件时,会得到巨大的速度)。写入的数组具有固定的大小,其值为20000
发布于 2016-05-13 18:05:36
由于您目前正在将这些保存为字符串值,最简单和最快的减小大小的方法是将它们保存为二进制值(或base64编码的字符串)。然后,您可以将所有int值转换为2个字节集(因为无符号的2个字节可以存储65536字节),并以这种方式保存这些值。这将从每个int值5个字节降到每个int值2个字节。立即节省60%。
对于Base64编码,我使用了我在互联网上发现的东西,叫做NSData+Base64。但我刚查到:
In the iOS 7 and Mac OS 10.9 SDKs, Apple introduced new base64 methods on NSData that make it unnecessary to use a 3rd party base 64 decoding library. What's more, they exposed access to private base64 methods that are retrospectively available back as far as IOS 4 and Mac OS 6.
通过认识到从一个元素到另一个元素的数据很可能不会在整个范围内发生变化,你可以进一步深入到压缩过程中,因为热图总是梯度的。然后,您可以将数组保存为上次元素后的差异,并可能将其降到单个字节(255值)更改集。但如果你看到的东西温度梯度非常快(或使用低分辨率相机),这可能会失去精确性。
如果您最终需要进行压缩,我将使用GTMNSData+zlib并在c# get服务中解压缩它。因此,只要做一点点工作,它就会跨平台。
发布于 2016-05-13 16:57:39
要正确地回答这个问题,需要更多关于问题域的信息。最有可能的是,2D数组是错误的数据结构,但是如果没有更多的信息,很难判断。
这些数组中存储的数据是什么?
发布于 2016-05-13 19:01:15
https://stackoverflow.com/questions/37214954
复制相似问题