【问题标题】:In Core Data, is it possible to create a table without an index and then add an index after all the inserts are complete?在Core Data中,是否可以创建一个没有索引的表,然后在所有插入完成后添加索引?
【发布时间】:2014-06-11 10:19:14
【问题描述】:

我在大数据应用程序中使用由 Sqllite 支持的 Core Data。我目前的问题是,如果我索引一个特定的属性,随着插入次数的增加,导入速度会随着时间的推移而显着下降:

SQLite insert speed slows as number of records increases due to an index

显然 NOT 索引它会导致视图问题,所以这不是一个真正的选择。原代码贴在这里:core data object insert in loop causes problems with NSNumber* property on object novel in inner-loop

在 Core Data 中,是否可以在我完成导入后为属性创建索引?

【问题讨论】:

  • 这真的有帮助吗?您仍然需要为所有数据编制索引。
  • 确实如此。我想我认为这是一个批处理问题,但问题在于数据的大小。我最好的解决方法是创建多个表,每个表都有一个查找表(即分片),如下所示:stackoverflow.com/questions/3676209/… 不确定这是否适用于 Core Data,即使这些表是静态创建的。跨度>
  • 评论发错地方了

标签: sqlite cocoa core-data indexing


【解决方案1】:

你需要一个编译周期来做到这一点。或者你的包中可能有两个xcdatamodels,除了麻烦实体属性的索引设置之外,它们是相同的。

有很多方法可以加快 Core Data 中的插入速度。我们可以看到插入代码吗?详细输出 (-com.apple.CoreData.SQLDebug 1) 告诉您什么?

这是发布到 Dropbox 的日志文件的摘录:

CoreData: annotation: creating schema.
CoreData: sql: pragma page_size=4096
CoreData: sql: pragma auto_vacuum=2
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_METADATA'
CoreData: sql: CREATE TABLE ZDATUM ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZSAMPLEID INTEGER, ZTAGID INTEGER, ZLOCUS INTEGER, ZSAMPLE INTEGER, ZDEPTHDATA VARCHAR, ZNAME VARCHAR, ZALLELEDATA BLOB, ZDATUMDATA BLOB, ZHAPLOTYPEDATA BLOB, ZMETADATA BLOB, ZSNPDATA BLOB, ZSTACKDATA BLOB )
CoreData: sql: CREATE INDEX ZDATUM_ZSAMPLEID_INDEX ON ZDATUM (ZSAMPLEID)
CoreData: sql: CREATE INDEX ZDATUM_ZLOCUS_INDEX ON ZDATUM (ZLOCUS)
CoreData: sql: CREATE INDEX ZDATUM_ZSAMPLE_INDEX ON ZDATUM (ZSAMPLE)
CoreData: sql: CREATE TABLE ZGENERICHASH ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZKEY VARCHAR, ZSTRINGVALUE VARCHAR, ZTYPE VARCHAR, ZDATAVALUE BLOB )
CoreData: sql: CREATE TABLE ZLOCUS ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZBASEPAIRS INTEGER, ZLENGTH INTEGER, ZLOCUSID INTEGER, ZPARENTCOUNT INTEGER, ZPROGENYCOUNT INTEGER, ZCHROMOSOME VARCHAR, ZCONSENSUS VARCHAR, ZMARKER VARCHAR, ZRATIO VARCHAR, ZSTRAND VARCHAR, ZTYPE VARCHAR, ZALLELEDATA BLOB, ZMETADATA BLOB, ZSNPDATA BLOB )
CoreData: sql: CREATE INDEX ZLOCUS_ZBASEPAIRS_INDEX ON ZLOCUS (ZBASEPAIRS)
CoreData: sql: CREATE INDEX ZLOCUS_ZLOCUSID_INDEX ON ZLOCUS (ZLOCUSID)
CoreData: sql: CREATE TABLE ZPOPULATION ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZPOPULATIONID INTEGER, ZNAME VARCHAR, ZMETADATA BLOB )
CoreData: sql: CREATE TABLE ZSAMPLE ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZSAMPLEID INTEGER, ZPOPULATION INTEGER, ZNAME VARCHAR, ZMETADATA BLOB )
CoreData: sql: CREATE INDEX ZSAMPLE_ZPOPULATION_INDEX ON ZSAMPLE (ZPOPULATION)
CoreData: sql: CREATE TABLE ZSTACKENTRYDATUM ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZSAMPLEID INTEGER, ZTAGID INTEGER, ZNAME VARCHAR, ZMETADATA BLOB, ZSTACKDATA BLOB )
CoreData: sql: CREATE INDEX ZSTACKENTRYDATUM_ZSAMPLEID_INDEX ON ZSTACKENTRYDATUM (ZSAMPLEID)
CoreData: sql: CREATE INDEX ZSTACKENTRYDATUM_ZTAGID_INDEX ON ZSTACKENTRYDATUM (ZTAGID)
CoreData: annotation: Creating primary key table.
CoreData: sql: CREATE TABLE Z_PRIMARYKEY (Z_ENT INTEGER PRIMARY KEY, Z_NAME VARCHAR, Z_SUPER INTEGER, Z_MAX INTEGER)
CoreData: sql: INSERT INTO Z_PRIMARYKEY(Z_ENT, Z_NAME, Z_SUPER, Z_MAX) VALUES(1, 'Datum', 0, 0)
CoreData: sql: INSERT INTO Z_PRIMARYKEY(Z_ENT, Z_NAME, Z_SUPER, Z_MAX) VALUES(2, 'GenericHash', 0, 0)
CoreData: sql: INSERT INTO Z_PRIMARYKEY(Z_ENT, Z_NAME, Z_SUPER, Z_MAX) VALUES(3, 'Locus', 0, 0)
CoreData: sql: INSERT INTO Z_PRIMARYKEY(Z_ENT, Z_NAME, Z_SUPER, Z_MAX) VALUES(4, 'Population', 0, 0)
CoreData: sql: INSERT INTO Z_PRIMARYKEY(Z_ENT, Z_NAME, Z_SUPER, Z_MAX) VALUES(5, 'Sample', 0, 0)
CoreData: sql: INSERT INTO Z_PRIMARYKEY(Z_ENT, Z_NAME, Z_SUPER, Z_MAX) VALUES(6, 'StackEntryDatum', 0, 0)
CoreData: sql: CREATE TABLE Z_METADATA (Z_VERSION INTEGER PRIMARY KEY, Z_UUID VARCHAR(255), Z_PLIST BLOB)
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_METADATA'
CoreData: sql: DELETE FROM Z_METADATA WHERE Z_VERSION = ?
CoreData: sql: INSERT INTO Z_METADATA (Z_VERSION, Z_UUID, Z_PLIST) VALUES (?, ?, ?)
CoreData: sql: COMMIT
CoreData: sql: pragma cache_size=500
CoreData: sql: SELECT Z_VERSION, Z_UUID, Z_PLIST FROM Z_METADATA
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZMETADATA, t0.ZNAME, t0.ZPOPULATIONID FROM ZPOPULATION t0
CoreData: annotation: sql connection fetch time: 0.0003s
CoreData: annotation: total fetch execution time: 0.0005s for 0 rows.
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: SELECT Z_MAX FROM Z_PRIMARYKEY WHERE Z_ENT = ?
CoreData: sql: UPDATE Z_PRIMARYKEY SET Z_MAX = ? WHERE Z_ENT = ? AND Z_MAX = ?
CoreData: sql: COMMIT
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: INSERT INTO ZDATUM(Z_PK, Z_ENT, Z_OPT, ZLOCUS, ZSAMPLE, ZALLELEDATA, ZDATUMDATA, ZDEPTHDATA, ZHAPLOTYPEDATA, ZMETADATA, ZNAME, ZSAMPLEID, ZSNPDATA, ZSTACKDATA, ZTAGID) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
CoreData: sql: INSERT INTO ZGENERICHASH(Z_PK, Z_ENT, Z_OPT, ZDATAVALUE, ZKEY, ZSTRINGVALUE, ZTYPE) VALUES(?, ?, ?, ?, ?, ?, ?)
CoreData: sql: INSERT INTO ZGENERICHASH(Z_PK, Z_ENT, Z_OPT, ZDATAVALUE, ZKEY, ZSTRINGVALUE, ZTYPE) VALUES(?, ?, ?, ?, ?, ?, ?)
CoreData: sql: INSERT INTO ZGENERICHASH(Z_PK, Z_ENT, Z_OPT, ZDATAVALUE, ZKEY, ZSTRINGVALUE, ZTYPE) VALUES(?, ?, ?, ?, ?, ?, ?)
CoreData: sql: INSERT INTO ZLOCUS(Z_PK, Z_ENT, Z_OPT, ZALLELEDATA, ZBASEPAIRS, ZCHROMOSOME, ZCONSENSUS, ZLENGTH, ZLOCUSID, ZMARKER, ZMETADATA, ZPARENTCOUNT, ZPROGENYCOUNT, ZRATIO, ZSNPDATA, ZSTRAND, ZTYPE) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
CoreData: sql: INSERT INTO ZLOCUS(Z_PK, Z_ENT, Z_OPT, ZALLELEDATA, ZBASEPAIRS, ZCHROMOSOME, ZCONSENSUS, ZLENGTH, ZLOCUSID, ZMARKER, ZMETADATA, ZPARENTCOUNT, ZPROGENYCOUNT, ZRATIO, ZSNPDATA, ZSTRAND, ZTYPE) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
CoreData: sql: INSERT INTO ZLOCUS(Z_PK, Z_ENT, Z_OPT, ZALLELEDATA, ZBASEPAIRS, ZCHROMOSOME, ZCONSENSUS, ZLENGTH, ZLOCUSID, ZMARKER, ZMETADATA, ZPARENTCOUNT, ZPROGENYCOUNT, ZRATIO, ZSNPDATA, ZSTRAND, ZTYPE) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
CoreData: sql: INSERT INTO ZLOCUS(Z_PK, Z_ENT, Z_OPT, ZALLELEDATA, ZBASEPAIRS, ZCHROMOSOME, ZCONSENSUS, ZLENGTH, ZLOCUSID, ZMARKER, ZMETADATA, ZPARENTCOUNT, ZPROGENYCOUNT, ZRATIO, ZSNPDATA, ZSTRAND, ZTYPE) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
CoreData: sql: INSERT INTO ZLOCUS(Z_PK, Z_ENT, Z_OPT, ZALLELEDATA, ZBASEPAIRS, ZCHROMOSOME, ZCONSENSUS, ZLENGTH, ZLOCUSID, ZMARKER, ZMETADATA, ZPARENTCOUNT, ZPROGENYCOUNT, ZRATIO, ZSNPDATA, ZSTRAND, ZTYPE) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

CoreData: sql: INSERT INTO ZLOCUS(Z_PK, Z_ENT, Z_OPT, ZALLELEDATA, ZBASEPAIRS, ZCHROMOSOME, ZCONSENSUS, ZLENGTH, ZLOCUSID, ZMARKER, ZMETADATA, ZPARENTCOUNT, ZPROGENYCOUNT, ZRATIO, ZSNPDATA, ZSTRAND, ZTYPE) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
CoreData: sql: INSERT INTO ZLOCUS(Z_PK, Z_ENT, Z_OPT, ZALLELEDATA, ZBASEPAIRS, ZCHROMOSOME, ZCONSENSUS, ZLENGTH, ZLOCUSID, ZMARKER, ZMETADATA, ZPARENTCOUNT, ZPROGENYCOUNT, ZRATIO, ZSNPDATA, ZSTRAND, ZTYPE) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
CoreData: sql: INSERT INTO ZPOPULATION(Z_PK, Z_ENT, Z_OPT, ZMETADATA, ZNAME, ZPOPULATIONID) VALUES(?, ?, ?, ?, ?, ?)
CoreData: sql: INSERT INTO ZPOPULATION(Z_PK, Z_ENT, Z_OPT, ZMETADATA, ZNAME, ZPOPULATIONID) VALUES(?, ?, ?, ?, ?, ?)
CoreData: sql: INSERT INTO ZPOPULATION(Z_PK, Z_ENT, Z_OPT, ZMETADATA, ZNAME, ZPOPULATIONID) VALUES(?, ?, ?, ?, ?, ?)
CoreData: sql: INSERT INTO ZSAMPLE(Z_PK, Z_ENT, Z_OPT, ZPOPULATION, ZMETADATA, ZNAME, ZSAMPLEID) VALUES(?, ?, ?, ?, ?, ?, ?)
CoreData: sql: INSERT INTO ZSAMPLE(Z_PK, Z_ENT, Z_OPT, ZPOPULATION, ZMETADATA, ZNAME, ZSAMPLEID) VALUES(?, ?, ?, ?, ?, ?, ?)
CoreData: sql: INSERT INTO ZSAMPLE(Z_PK, Z_ENT, Z_OPT, ZPOPULATION, ZMETADATA, ZNAME, ZSAMPLEID) VALUES(?, ?, ?, ?, ?, ?, ?)
CoreData: sql: COMMIT
CoreData: sql: pragma page_count
CoreData: annotation: sql execution time: 0.0003s
CoreData: sql: pragma freelist_count
CoreData: annotation: sql execution time: 0.0002s
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: COMMIT
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: INSERT INTO ZDATUM(Z_PK, Z_ENT, Z_OPT, ZLOCUS, ZSAMPLE, ZALLELEDATA, ZDATUMDATA, ZDEPTHDATA, ZHAPLOTYPEDATA, ZMETADATA, ZNAME, ZSAMPLEID, ZSNPDATA, ZSTACKDATA, ZTAGID) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
CoreData: sql: INSERT INTO ZDATUM(Z_PK, Z_ENT, Z_OPT, ZLOCUS, ZSAMPLE, ZALLELEDATA, ZDATUMDATA, ZDEPTHDATA, ZHAPLOTYPEDATA, ZMETADATA, ZNAME, ZSAMPLEID, ZSNPDATA, ZSTACKDATA, ZTAGID) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
CoreData: sql: INSERT INTO ZDATUM(Z_PK, Z_ENT, Z_OPT, ZLOCUS, ZSAMPLE, ZALLELEDATA, ZDATUMDATA, ZDEPTHDATA, ZHAPLOTYPEDATA, ZMETADATA, ZNAME, ZSAMPLEID, ZSNPDATA, ZSTACKDATA, ZTAGID) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
CoreData: sql: INSERT INTO ZDATUM(Z_PK, Z_ENT, Z_OPT, ZLOCUS, ZSAMPLE, ZALLELEDATA, ZDATUMDATA, ZDEPTHDATA, ZHAPLOTYPEDATA, ZMETADATA, ZNAME, ZSAMPLEID, ZSNPDATA, ZSTACKDATA, ZTAGID) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)


CoreData: sql: INSERT INTO ZDATUM(Z_PK, Z_ENT, Z_OPT, ZLOCUS, ZSAMPLE, ZALLELEDATA, ZDATUMDATA, ZDEPTHDATA, ZHAPLOTYPEDATA, ZMETADATA, ZNAME, ZSAMPLEID, ZSNPDATA, ZSTACKDATA, ZTAGID) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
CoreData: sql: INSERT INTO ZDATUM(Z_PK, Z_ENT, Z_OPT, ZLOCUS, ZSAMPLE, ZALLELEDATA, ZDATUMDATA, ZDEPTHDATA, ZHAPLOTYPEDATA, ZMETADATA, ZNAME, ZSAMPLEID, ZSNPDATA, ZSTACKDATA, ZTAGID) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
CoreData: sql: COMMIT
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZALLELEDATA, t0.ZDATUMDATA, t0.ZDEPTHDATA, t0.ZHAPLOTYPEDATA, t0.ZMETADATA, t0.ZNAME, t0.ZSAMPLEID, t0.ZSNPDATA, t0.ZSTACKDATA, t0.ZTAGID, t0.ZLOCUS, t0.ZSAMPLE FROM ZDATUM t0
CoreData: annotation: sql connection fetch time: 0.0020s
CoreData: annotation: total fetch execution time: 0.0091s for 1202 rows.
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZMETADATA, t0.ZNAME, t0.ZPOPULATIONID FROM ZPOPULATION t0 WHERE  t0.ZNAME = ?
CoreData: annotation: sql connection fetch time: 0.0003s
CoreData: annotation: total fetch execution time: 0.0005s for 1 rows.
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZMETADATA, t0.ZNAME, t0.ZPOPULATIONID FROM ZPOPULATION t0 WHERE  t0.ZNAME = ?
CoreData: annotation: sql connection fetch time: 0.0002s
CoreData: annotation: total fetch execution time: 0.0004s for 1 rows.
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZMETADATA, t0.ZNAME, t0.ZPOPULATIONID FROM ZPOPULATION t0 WHERE  t0.ZNAME = ?
CoreData: annotation: sql connection fetch time: 0.0002s
CoreData: annotation: total fetch execution time: 0.0004s for 1 rows.
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZDATAVALUE, t0.ZKEY, t0.ZSTRINGVALUE, t0.ZTYPE FROM ZGENERICHASH t0 WHERE  t0.ZKEY = ?
CoreData: annotation: sql connection fetch time: 0.0003s
CoreData: annotation: total fetch execution time: 0.0005s for 1 rows.
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZMETADATA, t0.ZNAME, t0.ZSAMPLEID, t0.ZPOPULATION FROM ZSAMPLE t0 WHERE  t0.ZNAME = ?
CoreData: annotation: sql connection fetch time: 0.0002s
CoreData: annotation: total fetch execution time: 0.0004s for 1 rows.
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZALLELEDATA, t0.ZDATUMDATA, t0.ZDEPTHDATA, t0.ZHAPLOTYPEDATA, t0.ZMETADATA, t0.ZNAME, t0.ZSAMPLEID, t0.ZSNPDATA, t0.ZSTACKDATA, t0.ZTAGID, t0.ZLOCUS, t0.ZSAMPLE FROM ZDATUM t0 WHERE  t0.ZSAMPLEID = ?
CoreData: annotation: sql connection fetch time: 0.0010s
CoreData: annotation: total fetch execution time: 0.0045s for 421 rows.
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: UPDATE ZDATUM SET ZSNPDATA = ?, Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
CoreData: sql: UPDATE ZDATUM SET ZSNPDATA = ?, Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
CoreData: sql: UPDATE ZDATUM SET ZSNPDATA = ?, Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
CoreData: sql: UPDATE ZDATUM SET ZSNPDATA = ?, Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
CoreData: sql: UPDATE ZDATUM SET ZSNPDATA = ?, Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
CoreData: sql: UPDATE ZDATUM SET ZSNPDATA = ?, Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
CoreData: sql: UPDATE ZDATUM SET ZSNPDATA = ?, Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
CoreData: sql: UPDATE ZDATUM SET ZSNPDATA = ?, Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
CoreData: sql: UPDATE ZDATUM SET ZSNPDATA = ?, Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?


CoreData: sql: UPDATE ZLOCUS SET ZPROGENYCOUNT = ?, Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
CoreData: sql: UPDATE ZLOCUS SET ZPROGENYCOUNT = ?, Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
CoreData: sql: UPDATE ZLOCUS SET ZPROGENYCOUNT = ?, Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
CoreData: sql: COMMIT
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZMETADATA, t0.ZNAME, t0.ZSAMPLEID, t0.ZPOPULATION FROM ZSAMPLE t0 WHERE  t0.ZNAME = ?
CoreData: annotation: sql connection fetch time: 0.0003s
CoreData: annotation: total fetch execution time: 0.0005s for 1 rows.
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZDATAVALUE, t0.ZKEY, t0.ZSTRINGVALUE, t0.ZTYPE FROM ZGENERICHASH t0 WHERE  t0.ZKEY = ?
CoreData: annotation: sql connection fetch time: 0.0002s
CoreData: annotation: total fetch execution time: 0.0005s for 1 rows.
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: COMMIT
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: INSERT INTO ZSTACKENTRYDATUM(Z_PK, Z_ENT, Z_OPT, ZMETADATA, ZNAME, ZSAMPLEID, ZSTACKDATA, ZTAGID) VALUES(?, ?, ?, ?, ?, ?, ?, ?)
CoreData: sql: COMMIT
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: COMMIT
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: INSERT INTO ZSTACKENTRYDATUM(Z_PK, Z_ENT, Z_OPT, ZMETADATA, ZNAME, ZSAMPLEID, ZSTACKDATA, ZTAGID) VALUES(?, ?, ?, ?, ?, ?, ?, ?)
CoreData: sql: COMMIT
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: COMMIT
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: INSERT INTO ZSTACKENTRYDATUM(Z_PK, Z_ENT, Z_OPT, ZMETADATA, ZNAME, ZSAMPLEID, ZSTACKDATA, ZTAGID) VALUES(?, ?, ?, ?, ?, ?, ?, ?)
CoreData: sql: COMMIT
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: COMMIT
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: INSERT INTO ZSTACKENTRYDATUM(Z_PK, Z_ENT, Z_OPT, ZMETADATA, ZNAME, ZSAMPLEID, ZSTACKDATA, ZTAGID) VALUES(?, ?, ?, ?, ?, ?, ?, ?)
CoreData: sql: COMMIT
CoreData: sql: pragma page_count
CoreData: annotation: sql execution time: 0.0003s
CoreData: sql: pragma freelist_count
CoreData: annotation: sql execution time: 0.0002s
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: COMMIT



CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: INSERT INTO ZSTACKENTRYDATUM(Z_PK, Z_ENT, Z_OPT, ZMETADATA, ZNAME, ZSAMPLEID, ZSTACKDATA, ZTAGID) VALUES(?, ?, ?, ?, ?, ?, ?, ?)
CoreData: sql: COMMIT
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: COMMIT
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: INSERT INTO ZSTACKENTRYDATUM(Z_PK, Z_ENT, Z_OPT, ZMETADATA, ZNAME, ZSAMPLEID, ZSTACKDATA, ZTAGID) VALUES(?, ?, ?, ?, ?, ?, ?, ?)
CoreData: sql: COMMIT
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: COMMIT
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: INSERT INTO ZSTACKENTRYDATUM(Z_PK, Z_ENT, Z_OPT, ZMETADATA, ZNAME, ZSAMPLEID, ZSTACKDATA, ZTAGID) VALUES(?, ?, ?, ?, ?, ?, ?, ?)
CoreData: sql: COMMIT
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: COMMIT
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: INSERT INTO ZSTACKENTRYDATUM(Z_PK, Z_ENT, Z_OPT, ZMETADATA, ZNAME, ZSAMPLEID, ZSTACKDATA, ZTAGID) VALUES(?, ?, ?, ?, ?, ?, ?, ?)
CoreData: sql: COMMIT
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: COMMIT
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: INSERT INTO ZSTACKENTRYDATUM(Z_PK, Z_ENT, Z_OPT, ZMETADATA, ZNAME, ZSAMPLEID, ZSTACKDATA, ZTAGID) VALUES(?, ?, ?, ?, ?, ?, ?, ?)
CoreData: sql: COMMIT
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: COMMIT
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: INSERT INTO ZSTACKENTRYDATUM(Z_PK, Z_ENT, Z_OPT, ZMETADATA, ZNAME, ZSAMPLEID, ZSTACKDATA, ZTAGID) VALUES(?, ?, ?, ?, ?, ?, ?, ?)
CoreData: sql: COMMIT
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: COMMIT

【讨论】:

  • 代码已发布在这里:stackoverflow.com/questions/23253242/… 这两个 xdatamodel 将如何解决这个问题?在某些时候,我需要批量插入。到目前为止,我保留核心数据的“最佳”想法是创建一系列“空”表并根据大小均匀分布。将尝试为您获取 SQLDebug 输出。
  • 这里是跟踪示例(只是 coreData):dl.dropboxusercontent.com/u/101534245/small_sample2.txt Datum 和 StackEntryDatum 或随着进一步插入而变慢的代码部分。
  • COMMITBEGIN EXCLUSIVECOMMITBEGIN EXCLUSIVEINSERT INTO ZSTACKENTRYDATUMCOMMIT 的重复在我看来很可疑。您是否锁定/保存每个插入的上下文?我看不出您引用的代码如何生成您引用的日志。
  • 抱歉,我认为我包含了太多的堆栈跟踪(不过,这也可能是一个问题区域)。我将堆栈跟踪限制在我正在查看的部分:dl.dropboxusercontent.com/u/101534245/small_sample3.txt 具体来说,我正在查看 ZDATUM 中的插入(DatumMO 映射到 Datum)。谢谢。
  • Hal,很高兴我发布了完整的堆栈跟踪。你最终修复了我的另一段代码。希望我能给你一个“答案”。
【解决方案2】:

答案最终与 SQLite 有更多关系,我在这里找到了它:

http://sqlite.1065341.n5.nabble.com/Improving-Bulk-Insert-Speed-C-C-td74827.html

我确信有更好的选择,但调整缓存大小,至少对于批量导入有很大帮助。

NSMutableDictionary *pragmaOptions = [NSMutableDictionary dictionary];
[pragmaOptions setObject:@"EXCLUSIVE" forKey:@"locking_mode"];
[pragmaOptions setObject:@"OFF" forKey:@"synchronous"];
[pragmaOptions setObject:[NSNumber numberWithInt:400000] forKey:@"cache_size"];
[pragmaOptions setObject:@"MEMORY" forKey:@"temp_store"];
[pragmaOptions setObject:@"OFF" forKey:@"count_changes"];
[pragmaOptions setObject:@"NONE" forKey:@"auto_vacuum"];


NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                         [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption
                         ,[NSNumber numberWithBool:YES],NSInferMappingModelAutomaticallyOption
                         ,pragmaOptions,NSSQLitePragmasOption
                         , nil];    

【讨论】:

    猜你喜欢
    • 2010-12-31
    • 1970-01-01
    • 2021-08-31
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多