2010-01-23 27 views
2

我有一個數據模型,它是有點像這樣簡化圖:核心數據使用大量的內存

alt text http://dl.dropbox.com/u/545670/thedatamodel.png

這是一個有點怪異,但這個想法是,應用程序管理多個賬戶/一個人可能會將身份識別到單個消息傳遞系統中。每個帳戶都與系統中的一個用戶相關聯,並且每個消息都可能被看到/發送到多個帳戶(但它們具有全局唯一ID,因此在導入時使用messageID屬性來獲取可能已經存在的消息對象由前一會議下載和導入)。

從每個帳戶的角度使用該應用程序 - 我的意思是您選擇要使用哪個帳戶,然後從窗口中的該帳戶的角度看到消息和內容。所以,我有連接到帳戶,這樣我可以輕鬆地獲得應使用可顯示的信息的消息獲取這樣的:

fetch.fetchPredicate = [NSPredicate predicateWithFormat:@"%@ IN accounts", theAccount]; 
    fetch.sortDescriptors = [NSArray arrayWithObject:[[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO]]; 
    fetch.fetchLimit = 20; 

這似乎是正確的方式在設置此消息被共享在賬戶之間,如果一條消息被標記爲一條消息,我希望它被另一條消息讀取,等等。

無論如何,在所有這些設置之後,最大的問題是內存使用似乎變得有點瘋狂。當我設置一個將數百條消息導入系統的測試用例,並定期重新獲取(使用上述提取)並在列表中顯示它們(只列出最後20個)時,內存會變得瘋狂。 60MB .. 70MB ... 100MB ..等

我追蹤到帳戶和消息之間的多對多關係。即使開啓了垃圾收集,託管對象仍然被帳戶的消息關係屬性強烈引用。我知道這一點,因爲我把日誌放入了我的Message實例的finalize中,並且永遠不會看到它 - 但是,如果我定期重置上下文或在帳戶對象上執行refreshObject:mergeChanges:,我會看到最終消息和內存使用保持相當一致(雖然仍然有所增長,但考慮到我正在進口東西,這是可以預料的)。問題是,我無法一直重置上下文或帳戶對象,因爲這真的會讓觀察者迷惑,觀察者正在觀察帳戶對象的其他屬性!

我可能只是對這個錯誤進行建模或者錯誤的思考,但是我一直在反覆閱讀,認爲核心數據是一個對象圖而不是數據庫是很重要的。我想我已經在這裏做了,但它似乎正在造成麻煩。我該怎麼辦?

回答

2

使用對象圖工具。它會告訴你所有的所有權保持一個對象的活着。

1
+0

是的。我相信我根據指南設置了一些東西。我甚至可以在另一個線程上使用自己的上下文運行導入批量,而且它仍然在不斷增長。 :( – Sean 2010-01-26 01:48:53