【发布时间】:2010-04-23 03:58:29
【问题描述】:
我有一个可以在列表中包含许多小元素的类。看起来像:
public class Farm {
private ArrayList<Horse> mHorses;
}
只是想知道如果 mHorses 数组增长到像 15,000 个元素这样疯狂的东西会发生什么。我假设尝试从数据存储中写入和读取它会很疯狂,因为我会在序列化过程中被杀死。
重要的是我可以在不分页的情况下一次性获取整个数组,并且每个 Horse 元素可能只有两个字符串属性,因此它们非常轻量级:
public class Horse {
private String mId;
private String mName;
}
我根本不需要索引这些马。将 mHorse 数组存储为原始文本字段并强制我的客户进行反序列化听起来合理吗?比如:
public class Farm {
private Text mHorsesSerialized;
}
然后,每当客户端收到 Farm 实例时,它必须获取原始的马串,并将其拆分以重新实例化列表,例如:
// 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 ...
}
是的……
所以希望从数据存储中读取 Farm 实例会很快,并且序列化惩罚由客户端支付,
谢谢
【问题讨论】:
-
为什么不使用逗号分隔值文件?在 Java 和 Python 中,您可以打开带有流的文本文件并逐行读取。将为您完成缓冲。因此,无需一次将整个数组加载到内存中。你为什么要?你会用它做什么?如果您想避免分页,请将其拆分为适当大小的块。顺便说一句,这与 Google 引擎有什么关系?
-
为什么不分页如此重要?
-
@Hamish 大概是在 App Engine 应用程序中执行此操作,这可能会影响他的某些操作方式。
-
private ArrayList<Horse> mHorses;应该是private List<Horse> mHorses;,除非您需要ArrayListAPI 有什么特别之处。 -
嗨,是的,这是在 App Engine 中完成的,我正在尝试最大限度地减少数据存储区的序列化/反序列化时间。问题的真正意义在于,这样的方案是否真的会为我节省大量时间——我不确定序列化的成本到底有多高,以及获取原始文本字段是否会明显更快。
标签: google-app-engine gwt