使用 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!)
- 我计算我有多少个 64 kb 块。
- 在 for 循环中,我得到了第一个 64kb。我将它们收集在一个数组中。现在由于第 3 步,我必须删除前 64kb 的字符串。
- 如果我的内存小于 64kb,我的循环就会出错。因此我的最后一步是在循环之外。
代码运行良好,但速度极慢。我需要加快我的代码。你知道怎么做吗?
非常感谢。
如果不修改原字符串可能会更有效,
并且只使用两个索引(from
和 to
)来遍历字符串:
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 进行了更新。)
我想将一个最大 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!)
- 我计算我有多少个 64 kb 块。
- 在 for 循环中,我得到了第一个 64kb。我将它们收集在一个数组中。现在由于第 3 步,我必须删除前 64kb 的字符串。
- 如果我的内存小于 64kb,我的循环就会出错。因此我的最后一步是在循环之外。
代码运行良好,但速度极慢。我需要加快我的代码。你知道怎么做吗?
非常感谢。
如果不修改原字符串可能会更有效,
并且只使用两个索引(from
和 to
)来遍历字符串:
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 进行了更新。)