我正在建立一个大型的CSV (4 4GB)的数据库,为自己的本地工作,这将不是一个生产应用程序。一开始我只有一个模型/实体,它包含8-9个属性,大部分是字符串和一些Int,我将有大约2000万条记录要存储。我将只从此CSV写入数据库一次,然后它将接收增量更新,以每月添加或修改大约50,000条记录。我将相当频繁地查询数据库,但仅作为单个用户。
核心数据是此场景的正确选择吗?我知道它是一个对象图,而不仅仅是一个数据库,我有一个16 8GB的内存iMac和一个8 8GB的Macbook pro,我不确定在使用核心数据时这可能会有多大的内存限制。我正在尝试弄清楚是使用SQLite更好,还是核心数据是适合这项工作的正确工具。
如果核心数据是这个用例的一个很好的选择,那么我可以使用一些帮助来组织记录的创建,而不是将自己限制在ram上。据我所知,我应该将实体写入子上下文,当我准备复制到磁盘时,我会将数据从子上下文传递到其父上下文(内存到内存),然后父上下文可以写入/刷新到磁盘。
这就是我可视化过程的方式,我将只在示例中的实体上使用一个属性。
DispatchQueue.global(qos: .background).async { //Non blocking
//iterate line by line over csv reader never exceeds 9.1MB takes 30 mins. I will look into chunking to better utilise multithreading later.
for (index, row) in reader.enumerated() {
let person = Person(entity: personEntity, insertInto: backgroundContext)
person.setValue(row[0], forKey: "name")
//When I hit x iterations or x seconds since last save - save to disk and clear the ram for the context
backgroundContext.perform {
do {
try backgroundContext.save() //I beleive pushes changes only to its parent context?
//Clear background context ram (of stored records)
// Main context should now write to disk and then it should also clear its ram
//do {
//main context work
//} catch {
//}
} catch {
//error handling
}
}
}
} 我有几个问题源于我没有清楚地理解核心数据结构。
1)在从主上下文保存到持久存储之后,我想确保主上下文可以从ram刷新那些记录。我不想清除ram中的所有记录,因为主上下文可能是从后台上下文写入的,而主上下文正在写入磁盘(实际上是数据丢失)。
2)类似于第1点,当后台上下文保存时,我希望确保后台上下文仅清除ram中保存到其父上下文的记录。
如果任何人能阐明一些情况或提供一些正确结构的例子,将不胜感激。
谢谢,
发布于 2019-04-28 20:50:39
我想NSManagedObjectContext类的reset()函数就是你想要的。
但是我真的认为你在错误地使用CoreData,我建议你用准备好的.sqlite文件(从CSV创建)来初始化CoreData。与手动创建NSManagedObject实例并将其保存到上下文中相比,它的工作效果更好,速度也更快。
https://stackoverflow.com/questions/55890118
复制相似问题