使用 Swift 将字符串拆分为 64kb

Split string in 64kb using Swift

我想将一个最大 8mb 的超大字符串拆分为 64kb 的块。目前我正在使用以下代码:

//1
var regData:String= "string up to 8mb"
var count=((countElements(self.regData!))/65536)

//2
for var index = 0; index < count; ++index {
    arr.append(self.regData!.substringWithRange(Range<String.Index>(start: advance(self.regData!.startIndex, 0),end: advance(self.regData!.startIndex, 65536))))
    self.regData!.removeRange(Range<String.Index>(start: self.regData!.startIndex, end:advance(self.regData!.startIndex, 65536)))
    println(index)
 }
//3
println("exit loop")
arr.append(self.regData!)
  1. 我计算我有多少个 64 kb 块。
  2. 在 for 循环中,我得到了第一个 64kb。我将它们收集在一个数组中。现在由于第 3 步,我必须删除前 64kb 的字符串。
  3. 如果我的内存小于 64kb,我的循环就会出错。因此我的最后一步是在循环之外。

代码运行良好,但速度极慢。我需要加快我的代码。你知道怎么做吗?

非常感谢。

如果不修改原字符串可能会更有效, 并且只使用两个索引(fromto)来遍历字符串:

let regData = "string up to 8mb"
let chunkSize = 65536

var array = [String]()
var from = regData.startIndex // start of current chunk
let end = regData.endIndex    // end of string
while from != end {
    // advance "from" by "chunkSize", but not beyond "end":
    let to = from.advancedBy(chunkSize, limit: end)
    array.append(regData.substringWithRange(from ..< to))
    from = to
}

请注意,这给出了 65536 个 个字符 的子字符串。由于 Swift 字符代表一个"Unicode grapheme cluster",这个不会 对应64kB的数据。如果你需要,那么你应该转换 字符串到 NSData 并将其分成块。

(针对 Swift 2 进行了更新。)