【问题标题】:Creating 20 million records in Core Data from CSV - macOS从 CSV 在 Core Data 中创建 2000 万条记录 - macOS
【发布时间】:2019-09-17 07:06:50
【问题描述】:

我正在从一个大型 CSV (4GB) 构建一个数据库,以便为自己在本地工作,这不会是一个生产应用程序。我只会有一个模型/实体开始,它包含 8-9 个属性,这些属性主要是字符串和少数 Int。我将存储大约 2000 万条记录。我只会从此 CSV 编写数据库一次,然后它将接收增量更新以每月添加或修改大约 50,000 条记录。我将相当频繁地查询数据库,但仅作为单个用户。

Core Data 是这个场景的正确选择吗?我知道它是一个对象图,而不仅仅是一个数据库,我有一个 16GB ram iMac 和一个 8GB Macbook pro,我不确定在使用 Core Data 时这可能会有多少内存限制。我正在尝试弄清楚使用 SQLite 是否会更好,或者 Core Data 是否是完成这项工作的正确工具。

如果 Core Data 是这个用例的一个不错的选择,那么我可以使用一些帮助来构建记录的创建,而无需将自己限制在 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 中保存到其父上下文的记录。

如果有人可以阐明情况或提供一些正确结构的示例,将不胜感激。

谢谢,

【问题讨论】:

    标签: swift macos cocoa core-data


    【解决方案1】:

    我认为NSManagedObjectContext 类的reset() 函数就是你要找的。

    但我真的认为您使用 CoreData 是错误的,我建议您使用准备好的 .sqlite 文件(从 CSV 创建)来初始化 CoreData。它比创建NSManagedObject 的实例并手动将它们保存到上下文中工作得更好、更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 1970-01-01
      相关资源
      最近更新 更多