Может ли кто-нибудь помочь пролить свет на то, почему приведенный ниже код потребляет более 100 МБ ОЗУ во время работы?Быстрое потребление памяти словаря является астрономическим
public struct Trie<Element : Hashable> {
private var children: [Element:Trie<Element>]
private var endHere : Bool
public init() {
children = [:]
endHere = false
}
public init<S : SequenceType where S.Generator.Element == Element>(_ seq: S) {
self.init(gen: seq.generate())
}
private init<G : GeneratorType where G.Element == Element>(var gen: G) {
if let head = gen.next() {
(children, endHere) = ([head:Trie(gen:gen)], false)
} else {
(children, endHere) = ([:], true)
}
}
private mutating func insert<G : GeneratorType where G.Element == Element>(var gen: G) {
if let head = gen.next() {
let _ = children[head]?.insert(gen) ?? { children[head] = Trie(gen: gen) }()
} else {
endHere = true
}
}
public mutating func insert<S : SequenceType where S.Generator.Element == Element>(seq: S) {
insert(seq.generate())
}
}
var trie = Trie<UInt32>()
for i in 0..<300000 {
trie.insert([UInt32(i), UInt32(i+1), UInt32(i+2)])
}
Основываясь на своих расчетах общее потребление памяти для указанной выше структуры данных должны быть где-то около следующее ...
3 * count * sizeof(Trie<UInt32>)
Или -
3 * 300,000 * 9 = 8,100,000 bytes = ~8 MB
Как это, что эти данные структура потребляет более 100 МБ во время работы?
Андерс, ты прав. Я играю с минимальной емкостью и, похоже, не имеет значения для значений в диапазоне от 0 до 2. В документации также указывается, что «фактическая емкость будет наименьшей мощностью 2, а это> = минимальная емкость». – Randy