当数据库 API 不支持流时,如何处理大型数据集的内存问题?
How to handle memory issues for large datasets when the database API doesn't support streaming?
我正致力于在我们的应用程序框架中通过 REST 公开数据,并且需要处理可能在没有 limits/offsets 的情况下查询数百万个对象的情况。数据库 API 不支持流式传输,这在不久的将来不会改变。处理这种情况的最佳方法是什么?
到目前为止我有几个选择:
- 实现我们自己的批处理机制。因此,从外部客户端只请求我们拥有的一切,但在内部我们使用限制和偏移量进行批处理。我们确实有唯一标识符,因此我们可以使用它们进行排序。
- 缺点是数据损坏的风险很小。我们的框架支持自引用,例如有人会检索所有类型为 Person 的对象。 Person id 500 指的是 Person id 1500。检索批次 1-1000,其中 person 500 指的是 person 1500。此数据被流式传输。然后删除 id 为 1500 的人并更新 id 为 500 的人的引用。检索到批次 1001-2000,但缺少人员 1500。第 500 个人的数据已经被流走了,现在即使在一个流中数据也是无效的。
- 设置检索对象的最大数量,让客户端处理批处理,包括场景处理上述数据损坏。
- 什么也不做,让应用程序内存不足。由使用该平台的开发人员决定不要公开大型表格,绝对不要公开给匿名用户。
虽然我希望听到一些替代方案。
我做了更多研究,认为没有合适的解决方案。最后,我们确实设法在数据库层中进行了必要的更改,以便能够流式传输数据。其他一切都会有太重要的缺点。
我正致力于在我们的应用程序框架中通过 REST 公开数据,并且需要处理可能在没有 limits/offsets 的情况下查询数百万个对象的情况。数据库 API 不支持流式传输,这在不久的将来不会改变。处理这种情况的最佳方法是什么?
到目前为止我有几个选择:
- 实现我们自己的批处理机制。因此,从外部客户端只请求我们拥有的一切,但在内部我们使用限制和偏移量进行批处理。我们确实有唯一标识符,因此我们可以使用它们进行排序。
- 缺点是数据损坏的风险很小。我们的框架支持自引用,例如有人会检索所有类型为 Person 的对象。 Person id 500 指的是 Person id 1500。检索批次 1-1000,其中 person 500 指的是 person 1500。此数据被流式传输。然后删除 id 为 1500 的人并更新 id 为 500 的人的引用。检索到批次 1001-2000,但缺少人员 1500。第 500 个人的数据已经被流走了,现在即使在一个流中数据也是无效的。
- 设置检索对象的最大数量,让客户端处理批处理,包括场景处理上述数据损坏。
- 什么也不做,让应用程序内存不足。由使用该平台的开发人员决定不要公开大型表格,绝对不要公开给匿名用户。
虽然我希望听到一些替代方案。
我做了更多研究,认为没有合适的解决方案。最后,我们确实设法在数据库层中进行了必要的更改,以便能够流式传输数据。其他一切都会有太重要的缺点。