我正在开展一个项目,我们需要以热图的形式汇总大量数据。该数据将尽可能长时间保存在数据库中。在某些时候,我们需要在矩阵(可能是?)中存储摘要,然后才能将热图的块绘制到屏幕上。我们正在用C#创建一个Windows窗体应用程序。
让我们假设热图将汇总在线地图程序(如谷歌地图)的日志文件。它将根据对该区域/地址发出请求的次数为特定地址或区域分配颜色。它可以以不同的详细程度汇总数据。也就是说,热图上的每个块都可以汇总特定地址的数据(最大细节,因此数十亿/数百万个块),或者它可以汇总对街道,城市或国家的请求(最小细节 - 几个块,因为它们每个代表一个国家)。想象一下,数百万的地址请求。我们已经考虑用数据库对此进行总结。问题是我们需要在屏幕上绘制这么多块(高达数十亿,但通常要少得多)。让我们假设这个数据汇总在一个数据库表中,该数据库表存储了较大区域的命中数。我们可以在不为每个区域构建对象的情况下将块绘制到窗口中,甚至可以从db表中引入所有信息吗?这是我的主要关注点,因为如果我们构建了一个矩阵,那么对于要求苛刻的请求,它可能大约为10 GB。
我很想知道我们可以在屏幕上绘制多少块,以及最好的方法是什么(即direct3d,XNA)。从上面看,您可以看到范围会发生很大变化,我们预计需要绘制数十亿个方块的可能性。我们将有一个垂直滚动条快速向下滚动以查看其他块。
总的来说,我想知道如何使用C#实现这一目标?为要求苛刻的请求创建矩阵可能需要大约10千兆字节。有没有办法绘制到不需要大量内存的屏幕(即为每个块创建一个对象)。如果我们可以将SQL查询的结果直接转换为屏幕上的渲染块,那将是理想的(即不构造对象等)。我们需要的只是正方形,它们唯一的属性是颜色,我们可能需要为每个块保持一个数字。
注意: 我们非常确定我们将如何绘制热图(如何向用户显示缩放,滚动等)。为了澄清,我更关心我们将如何实现我们的想法。是否有一个库或一些方法允许我们绘制这么多对象而不构建十亿个对象并使用千兆字节的数据。每个块基本上是一组相同颜色的像素(20×20)。我认为这不一定需要建造10亿个物体。
谢谢!
答案 0 :(得分:1)
如果这真的是用于图形热图,那么我同意这样的评论:至少780个笔记本电脑屏幕的图像是不切实际的。如果您在某个SQL(?)数据库中有此信息,那么您可以执行一个奇特的查询,将结果分区为特定宽度的存储区。数据库应该能够有效地将这些记录聚合到1680(像素宽)桶中。
此外,如果您的存储桶具有固定宽度(产生固定宽度的热图图像),则可以预先为数据库中的“地址”生成存储桶编号。正确索引,按此分组将非常快。
如果您需要查看1:1图像,您可能会考虑只渲染您滚动到的图像部分。这将显着减少存储当前视图所需的内存量。假设您不需要以100%实际查看所有780个屏幕的数据(特别是如果您将其与上面的“大图片视图”策略相结合),那么您也将节省处理费用。
“大图片视图”的聚合函数可能是MAX,SUM,AVG。如果这些功能不合适,请在热图中详细说明您要寻找的特定功能。
就绘图本身而言,每个框不需要“对象”,只需要在图形对象上绘制像素。
答案 1 :(得分:0)
我认为您正在寻找的技术称为“虚拟化”。现在我不是指硬件虚拟化,而是指技术,在这种技术中,您只为可见的项目创建具体的可视对象。许多网格和列表使用此技术以正常速度和内存消耗显示数千个项目。您还可以在交换具体数据对象时重用这些可视对象。
我还会质疑显示数百个细节的必要性。您应该使其类似于缩放或聚合数据以仅显示少数项目,然后让用户选择特定部分或数据。但我想你已经考虑过了。