0

我正在做一个项目,我们需要以热图的形式汇总大量数据。这些数据将尽可能长时间地保存在数据库中。在某些时候,我们需要将摘要存储在矩阵中(可能?),然后才能将热图的块绘制到屏幕上。我们正在使用 C# 创建一个 Windows 窗体应用程序。

假设热图将为在线地图程序(如谷歌地图)总结一个日志文件。它将根据向该区域/地址发出请求的次数为特定地址或区域分配颜色。它可以汇总不同详细级别的数据。也就是说,热图上的每个区块都可以汇总特定地址的数据(最大细节,因此数十亿/百万个区块),或者它可以汇总对街道、城市或国家的请求(最小细节 - 几个区块,因为它们每个代表一个国家)。想象一下,有数百万个地址请求。我们已经考虑用数据库来总结这一点。问题是我们需要在屏幕上绘制这么多块(最多数十亿,但通常少得多)。让' s 假设这些数据汇总在一个数据库表中,该表存储了对较大区域的命中数。我们可以在不为每个区域构造对象的情况下将块绘制到窗口,甚至不从 db 表中引入所有信息吗?这是我最关心的问题,因为如果我们确实构建了一个矩阵,那么对于要求苛刻的请求,它可能会达到 10 GB 左右。

我很想知道我们可以在屏幕上绘制多少块以及最好的方法是什么(即direct3d、XNA)。从上面,您可以看到范围会有很大差异,我们预计需要绘制数十亿个正方形的潜力。我们将有一个垂直滚动条来快速向下滚动以查看其他块。

总的来说,我想知道我们如何使用 C# 来实现这一点?为要求苛刻的请求创建矩阵可能需要大约 10 GB。有没有一种方法可以在不需要大量内存的情况下绘制到屏幕上(即为每个块创建一个对象)。如果我们可以将 SQL 查询的结果直接翻译成屏幕上的渲染块,那将是理想的(即不构造对象等)。我们需要的只是正方形,它们唯一的属性是颜色,我们可能需要为每个块维护一个数字。

注意:我们非常确定我们将如何绘制热图(缩放、滚动等应该如何呈现给用户)。澄清一下,我更关心我们将如何实施我们的想法。是否有一个库或某种方法允许我们在不构造十亿个对象和使用千兆字节数据的情况下绘制这么多对象。每个块本质上是一组相同颜色的像素 (20x20)。我不认为这需要构建 10 亿个对象。

谢谢!

4

2 回答 2

1

如果这真的是用于图形热图,那么我同意这样的评论,即至少 780 笔记本电脑屏幕宽的图像是不切实际的。如果您在某处的 SQL(?) 数据库中有此信息,那么您可以执行一个奇特的查询,将您的结果划分为特定宽度的存储桶。数据库应该能够有效地将这些记录聚合到 1680(像素宽)的桶中。

此外,如果您的存储桶具有固定宽度(产生固定宽度的热图图像),您可以为数据库中的“地址”预先生成存储桶编号。正确索引,按此分组会非常快。

如果您确实需要查看 1:1 图像,则可以考虑仅渲染您滚动到的图像的一部分。这将显着减少存储当前视图所需的内存量。假设您实际上不需要以 100% 的速度查看所有 780 个屏幕的数据(尤其是如果您将其与上面的“大图视图”策略结合使用),那么您也将节省处理费用。

“大图视图”的聚合函数可能是 MAX、SUM、AVG。如果这些功能不合适,请详细说明您要在热图中寻找的特定功能。

就绘图本身而言,您不需要每个框的“对象”,您只需要在图形对象上绘制像素即可。

于 2011-02-27T19:56:31.190 回答
0

我认为您正在寻找的技术称为“虚拟化”。现在我指的不是硬件虚拟化,而是技术,您只为可见的项目创建具体的视觉对象。许多网格和列表使用这种技术以正常速度和内存消耗显示数千个项目。您还可以在交换具体数据对象时重用这些可视对象。

我也会质疑显示数十亿细节的必要性。您应该使其类似于缩放或聚合数据以仅显示少数项目,然后让用户选择特定部分或数据的一部分。但我猜你有这个想法。

于 2011-02-27T20:09:16.890 回答