排序时流式传输大数据

Posted

技术标签:

【中文标题】排序时流式传输大数据【英文标题】:Streaming big data while sorting 【发布时间】:2015-08-30 10:25:03 【问题描述】:

我有大量数据,因此我无法将所有数据都保存在内存中,并且总是出现内存不足错误;显然,其中一种解决方案是在 Node.JS 中使用流式传输;但是流式传输是不可能的(据我所知),排序是我应用于数据的功能之一;是否有任何算法可能是分而治之的算法,我可以将其用于流式传输和排序的组合(这是我应用于数据的功能之一?)

【问题讨论】:

@KirillSlatin 这是一个对象数组!正如我所说,我不能将所有数据保存在内存中并进行排序(至少我会说基于朴素算法),您需要将所有数据都保存在内存中!是否使用分页无关紧要;换句话说,排序需要所有数据,并且您不能仅对部分数据应用排序(这是我的问题,这可能吗?是否有任何算法可以通过使用流式传输或分页结果对部分数据应用排序?) 你从哪里得到这么多的数据?数据库?我猜你并不真正理解分页的概念......对服务器的请求应该包含排序字段,它们的顺序,页码和页面大小。服务器排序并返回一小部分结果 如果您的数据库不支持排序并且服务器无法读取所有数据(这显然是排序所必需的),那么您唯一能做的就是 1. 购买更大的服务器(如果您的数据库增长)和 2. 切换到支持排序查询​​的数据库 数据从何而来,又将流向何方? dedicated sorting algorithms 用于内存中无法容纳的数据。 @Pasargad:请更具体地了解您正在使用的数据库。它到底不支持什么?如果大量排序数据对您的应用程序至关重要,这听起来像是您选择了错误的数据库引擎。这不应该在应用层处理。 【参考方案1】:

您可以使用Kinesis 流式传输数据并使用Kinesis Client Library 或subscribe a Lambda function to your Kinesis stream 并逐步维护已排序的物化视图。您将排序的物化视图存储在哪里以及如何划分数据将取决于您的应用程序。如果您无法存储整个排序的物化视图,则可能会有滚动视图。如果您的数据是时间序列的,或者具有其他一些自然顺序,您可以将有序属性的范围划分为多个块。然后,您可以拥有例如 1 天或 1 小时排序的数据块。换句话说,选择允许您根据需要将信息保留在内存中的排序细分。

【讨论】:

非常感谢您介绍亚马逊的这项超酷服务!所以主要的问题是我不能在内存中保存这个大的排序物化视图,也没有必要将它保存在内存中;如果我理解正确,要使用 Kinesis,我仍然需要将排序结果保存在内存中,它会逐渐变得越来越大,对吗?我理解正确吗?所需的解决方案是对 Kinesis 等服务的结果进行排序,并将其流式传输到响应中,而无需将其保存在内存中……感谢您的帮助…… 我更新了我的答案以解决将排序的物化视图分块的问题。

以上是关于排序时流式传输大数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 Node 流式传输大型大查询 SELECT?

使用 Protobuf-net 将大数据文件流式传输为 IEnumerable

对几乎已排序的大文件进行排序

将事件流式传输到大查询 - 数据流 - 将 **epoch 时间戳** (int) 插入时间戳列的最佳方式

将大字符串流式传输到 JAXB

如何流式传输(大)日志文件?