我正在尝试将大约11,000对的字典加载到Swift程序中(大约.7MB)。字典的值是数组,我需要能够遍历字典的数组并将这些值与另一个数组中的值进行比较。子阵列中平均有10个项目,但有些项目有两个或三个,有些项目有数百个。
程序崩溃,我正在寻找一种方法来修复它,同时保持我的基于Python的原型的功能。我正在考虑使用一堆属性列表,并将它们逐个加载到内存中,但这似乎效率低下。我该怎么做才能重新设计呢?
一些有问题的代码:var dictOfHashesAndMaterials:[String:[Int]]: = ["10928123sdfb234w3fw3": [123,435,1,573,456,3234,653,57856,434,345],"13435fw323df0239dfsdf":[435,756,978,231,5668,485,9678,1233,87,989]] // and 11,000 additional entries which look similar to this.
这就是我使用它的地方:`//填充成分列表的功能。 func populateListOfRecipes(){ var storedIngredients = UserDefaults.standard.object(forKey:“ingredients”)as! [INT]
for(key, value) in dictOfHashesAndMaterials{
let listSet = Set(storedMaterials)
let findListSet = Set(value)
if findListSet.isSubset(of: listSet){
print("found a match!")
arrayOfAvailableProjects.append(key)
}
}
tableView.reloadData()
}`
然后由链接到给定项目细节的单元格填充tableView。将哈希值发送到服务器时,将填写详细信息,相应的说明将完整返回给应用程序。
答案 0 :(得分:1)
它在模拟器中崩溃了吗?我使用模拟器使用30 GB文件而没有崩溃。在设备上是一个不同的故事...
无论如何,试试这个:
for(key, value) in dictOfHashesAndMaterials{
autoreleasepool {
let listSet = Set(storedMaterials)
let findListSet = Set(value)
if findListSet.isSubset(of: listSet){
print("found a match!")
arrayOfAvailableProjects.append(key)
}
}
}
tableView.reloadData()
}
通过每次迭代耗尽自动释放池,您将防止可用内存耗尽。