【问题标题】:Handling very large lists of objects without paging?在不分页的情况下处理非常大的对象列表?
【发布时间】: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&lt;Horse&gt; mHorses; 应该是 private List&lt;Horse&gt; mHorses;,除非您需要 ArrayList API 有什么特别之处。
  • 嗨,是的,这是在 App Engine 中完成的,我正在尝试最大限度地减少数据存储区的序列化/反序列化时间。问题的真正意义在于,这样的方案是否真的会为我节省大量时间——我不确定序列化的成本到底有多高,以及获取原始文本字段是否会明显更快。

标签: google-app-engine gwt


【解决方案1】:

一般来说,使用列表不是一个好主意,除非您的列表很短(这里不是这种情况!)或需要索引(这里也不是这种情况)。您还需要记住,序列化实体的最大大小为 1MB - 因此无论您使用何种序列化机制,都需要将 15,000 个列表条目放入 1MB 中。

如果它们确实合适,那么是的,使用您自己的序列化到 Blob 字段(不是文本字段,除非您使用 JSON 等文本格式)是您的最佳选择。

【讨论】:

    【解决方案2】:

    您可能需要考虑的另一个考虑因素是,您将从 GWT 发出一个大请求,并且可能会使用该请求的响应来构建某种包含 15,000 匹马的 UI。

    这不会很快,虽然它正在快速构建您的马匹列表,但 UI 的其余部分几乎无法使用。

    更重要的是,一旦显示,用户界面将几乎无法导航。这个 UI 是干什么用的?上市马匹,让一个可以选择?您是否希望必须筛选 15,000 个条目才能找到他们喜欢的条目?

    分页不仅是缓解服务器压力的一种方式,也是缓解浏览器和用户压力的一种方式。

    您可能想研究一些方法来允许用户搜索或过滤您的列表,否则他们几乎无法使用。为此,您可能需要重新构建数据模型。

    【讨论】:

    • 同意 100%,是的,阻止主线程反序列化是不好的。我只是想了解一下这是否是合理的最后努力。我可以使用自动分页方法来继续获取块而无需用户交互。
    猜你喜欢
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    相关资源
    最近更新 更多