Swift FileHandle的seek / readData性能

时间:2018-11-12 06:31:08

标签: swift binaryfiles filehandle

上下文:

我有一个项目,我在二进制文件和数据文件中存储了很多数据。我在二进制文件中检索了偏移量,并将其存储为UInt64,每个偏移量都为我提供了utf-8编码的String在另一个文件中的位置。

考虑所有的偏移量,我试图从utf-8文件中重建所有字符串。包含所有字符串的文件的大小正好为20437字节/约177000个字符串。

假设我已经获取了所有偏移量,现在需要一次重建一个字符串。我也有每个字符串的字节长度。

方法1:

我打开一个设置为utf8编码的文件的FileHandle,对于每个偏移量seek的偏移量并执行readData(ofLength:),整个操作非常长。超过35秒。

方法2:

我用Data初始化了Data(contentsOf: URL)对象。 然后,我为要构建的每个字符串执行Data.subdata(in: Range)。范围从偏移开始,到偏移+大小。 这会将整个文件加载到RAM中,并允许我检索每个String所需的字节。这比第一种选择要快得多,但可能会降低性能。

如何为该特定任务获得最佳性能?

1 个答案:

答案 0 :(得分:0)

我最近在将二进制数据缓存到磁盘或从磁盘加载二进制数据时经历了类似的经历。

我不确定最终过程是如何获得最佳性能,但是可以通过使用数据对象的“切片”而不是data.subdata()来进一步提高方法2的性能。这类似于使用数组切片。

这可能是因为不是从原始数据的COPIES创建更多数据对象,而是从切片返回的数据使用源Data对象作为参考。因为我的源数据实际上很大,所以这对我产生了重大影响。您应该同时介绍这两种方法,并查看它是否对您来说很明显。

https://developer.apple.com/documentation/foundation/data/1779919-subscript