2010-04-23 37 views
2

我有一個類可以包含列表中的許多小元素。看起來像:處理非常大的沒有分頁的對象列表?

public class Farm { 

    private ArrayList<Horse> mHorses; 
} 

只是想知道如果mHorses陣列發展到像15000元素一樣瘋狂會發生什麼。我假設試圖從數據存儲中寫入和讀取它會很瘋狂,因爲我會在序列化過程中遇害。

,我可以得到一個鏡頭,整個陣列無需分頁是很重要的,而每匹馬元素只可以在它有兩個字符串屬性,因此它們是相當輕巧:

public class Horse { 
    private String mId; 
    private String mName; 
} 

我不需要這些馬都是索引的。將mHorse數組存儲爲原始文本字段並強制客戶端執行反序列化是否合理?喜歡的東西:

public class Farm { 
    private Text mHorsesSerialized; 
} 

那麼只要客戶端收到一個農場的實例,它必須採取馬的原始字符串,它以拆分重新實例列表,像:

// GWT client perhaps 
Farm farm = rpcCall.getMyFarm(); 
String horsesSerialized = farm.getHorses(); 
String[] horseBlocks = horsesSerialized.split(","); 
for (int i = 0; i < horseBlocks.length; i++) { 
    // .. continue deserializing the individual objects ... 
} 

耶...

所以希望它會很快地從數據庫中讀取一個農場實例,並且序列處罰由客戶支付,

感謝

+0

爲什麼不使用逗號分隔值文件?在Java和Python中,您可以使用流打開文本文件並逐行讀取。緩衝將爲您完成。所以,不需要一次將整個數組加載到內存中。你爲什麼?你會用它做什麼?如果你想避免分頁,那麼把它分成適當大小的塊。順便說一句,這是如何與谷歌引擎相關? – 2010-04-23 04:04:14

+0

爲什麼你不頁面這麼重要? – 2010-04-23 04:06:46

+0

@Hamish推測他是在App Engine應用程序中這樣做的,這可能會影響他如何做某些事情。 – 2010-04-23 04:07:57

回答

0

通常,使用列表不是一個好主意,除非你的列表很短(不是這裏的情況!)或需要被索引(這裏也不是這樣)。您還需要記住,序列化實體的最大大小爲1MB - 因此,無論您使用哪種序列化機制,都需要將15,000個列表條目合併到1MB中。

如果他們確實適合,那麼是的,使用自己的序列化到Blob字段(不是文本字段,除非您使用像JSON這樣的文本格式)是最佳選擇。

+0

太棒了,謝謝。 – user246114 2010-04-24 02:10:46

0

您可能想要考慮的另一個問題是,您將向GWT發出一個大的請求,並且可能使用該請求的響應來構建某種15,000匹馬的UI。

這不會很快,並且在建立您的馬列表時,其餘的UI將幾乎無法使用。

更重要的是,UI顯示後幾乎不可能導航。這是什麼用戶界面?列出馬匹,以便可以選擇一匹馬?你想不得不篩選15,000個條目來找到他們喜歡的一個?

分頁不僅是緩解服務器壓力的一種方式,而且是緩解瀏覽器和用戶壓力的一種方式。

您可能想要通過某種方式來允許用戶搜索或過濾您的列表,否則幾乎不可能使用它們。要做到這一點,您可能需要重構數據模型。

+0

同意100%,是阻止反序列化的主線程將不會好。我只是想了解一下,如果這是一個合理的最後努力。我可以做一個自動化的分頁方法來保持讀取塊而不需要用戶的交互。 – user246114 2010-04-24 02:10:25

相關問題