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