2010-04-23 53 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