上下文:
我有一个项目,在这个项目中,我将大量数据存储在二进制文件和数据文件中。我在二进制文件中检索偏移量,这些偏移量存储为UInt64,每个偏移量都给出了utf-8编码字符串在另一个文件中的位置。
我正在尝试,给出所有的偏移量,从utf-8文件重建所有字符串。保存所有字符串的文件的大小正好为20437字节/大约177000字符串。
假设我已经检索了所有的偏移量,现在需要一次重建每个字符串。我还有每个字符串的长度(以字节为单位)。
方法1:
我打开一个FileHandle设置为utf8编码文件,对于每个偏移量i seek到偏移量并执行一个readData(ofLength:),整个操作非常长.超过35秒。
方法2:
我用Data初始化一个Data(contentsOf: URL)对象。然后,对我想构建的每个字符串执行一个Data.subdata(in: Range)。范围从偏移开始,结束到偏移+大小。这将将整个文件加载到RAM中,并允许我检索每个字符串所需的字节。这比第一种选择要快得多,但在性能上可能是糟糕的。
我如何才能在这个特定的任务中获得最佳的表现?
发布于 2019-06-03 08:35:35
最近,在将二进制数据缓存/加载到磁盘/从磁盘加载时,我也经历了类似的经历。
我不确定什么是最佳性能的最终过程,但是您可以进一步提高方法2的性能,方法是使用数据对象的“片段”而不是data.subdata()。这类似于使用数组片。
这可能是因为从切片返回的数据没有使用原始数据的副本创建更多的数据对象,而是使用源数据对象作为引用。这对我来说有很大的不同,因为我的源数据实际上相当大。您应该分析这两种方法,看看它是否对您有明显的影响。
https://developer.apple.com/documentation/foundation/data/1779919-subscript
https://stackoverflow.com/questions/53256938
复制相似问题