代码之家  ›  专栏  ›  技术社区  ›  treeface

在数据库中存储Mandelbrot值的最佳方法是什么?

  •  5
  • treeface  · 技术社区  · 14 年前

    我目前正在尝试渲染一个Mandelbrot集,我很快意识到,不必重新计算每次渲染的最大迭代次数是很有用的……另一方面,要跟踪的数据太多了。在我看来(基于我在RDMSes方面的有限经验),关系数据库可能不是一条发展的道路,因为我不希望随着数据集变得越来越大而影响性能。对于哈希表来说,这似乎是一种完美的情况,但我以前从未使用过哈希表,似乎无法用现有的web服务器语言(Python/PHP/whatever)解决如何使用或管理哈希表的问题。

    更明确一点:要存储的重要值是:

    • 这个 复平面上的一个数
    • 这个 复平面上的一个数
    • 数量 最大迭代次数
    • 完成的迭代 在达到最大迭代次数之前或直到点运行到无穷大
    • 这个 最终真实部分 n 迭代
    • 这个 最后虚部 复平面上的一个数 n 迭代

    在任何给定的时间,给定的 ,的 原虚部 ,和 最大迭代次数

    你觉得呢?哈希表是一种可行的方法吗?对于普通的数据结构来说,这个问题是否过于复杂?

    编辑

    应朱丽叶·诺伯特的善意请求,我将对这个问题作一点阐述。

    我的目标是允许用户在没有计算延迟的情况下放大Mandelbrot集(即使是通过预定义的缩放)。我还希望能够在一个浏览器中做到这一点,它不断地要求服务器提供一个新的数据数组,给出新的x和y坐标以及要在复杂平面上查看的高度和宽度。但是,由于计算像素颜色值可以更快地完成(给定max\u iter、real\u final和imag\u final),而且允许用户调整颜色设置也很好,所以我只向浏览器发送文章中列举的变量,并让用户的浏览器计算颜色。

    看看这个:

    http://jsfiddle.net/xfF3f/

    如果查看drawMandelbrot()函数,可以看到点循环将重要值存储在名为dataset的变量中。然后在drawMandelbrotFromData()函数中使用此变量,在该函数中,它执行计算每个像素的颜色所需的其余计算。

    如果你点击“cleardabrot”,它会用一个白色的矩形代替画布。如果您单击“refilldabrot”,它将再次运行drawMandelbrotFromData()函数…这样做是为了向您展示,如果不必执行痛苦的迭代计算,它实际上可以以多快的速度呈现集合。

    因此,这里的最终目标是能够以任意精度计算这些值,这样用户就可以缩放到集合的任何级别,让服务器计算出这些精确点(或者,最好是这些精确点附近的点)是否有任何数据,尽管我不确定如果不执行某种范围查询,如何做到这一点,然后逐像素地吐回信息。例如。。。

    • x = .000001 y = .0000231
    • 他在这个框架中选择的宽度和高度是 w = .00045 h = .00045

    1 回复  |  直到 14 年前
        1
  •  2
  •   user348466    14 年前

    在任何给定的时间,给定的原始 真实的部分,最初的想象 迭代,我希望能够 具有最终实数和实数的结果集 虚部。

    你的问题不清楚你为什么需要这个?为什么需要在同一点重新计算?

    如果您正在进行实时渲染,并且正在使用一些需要重新计算递推公式的处理(在相同的原点,使用相同的最大迭代次数),那么我可以想象您可以通过使用查找表来加快速度。

    显然,查找表必须比计算快。您需要一个查找表,对于该表,下面的操作总共花费的时间少于再次执行计算所花费的时间。

    • 计算索引(给定origo\u real、origo\u imag、max\u iter)
    • 加载缓存的计算(final\u real,final\u imag,actual\u iter)
    • 一个初始存储

    根据您将如何在相同的点上重新计算/重新访问,您可以这样划分问题:索引很可能在查找表中,并且查找表足够小,可以存储在一级或二级缓存中。

    这些是一些想法。。但你应该弄清楚你真正的问题是什么。

    如果你只是需要这些数据做进一步的分析,而实时性不是要求,那么。。。澄清你真正的问题是什么:)

    更新的答案

    它似乎类似于使用地图服务(放大/缩小、四处移动),也就是说,基本上是为给定的区域和缩放提供图像。

    无论如何。如果你的主要问题是带宽,但你有足够的计算能力,那么你可以存储在一个高度压缩的文件计算补丁的图像,以较低的质量和缓存这些图像。然后,您可能需要将这些补丁缝合在一起,以提供用户想要的确切区域。。诀窍是查询给定缩放和面积的最小面片集。

    我担心大多数查询会要求不存在的修补程序(因为任何缩放级别都是可能的)。也许一些关于谷歌地图/GIS系统如何工作的信息可以给你一些想法。如果您的主要问题是CPU,那么您可以采用不同的方法,让用户在小程序中进行计算(并可能发回结果)

    如果您这样做是为了学习如何在客户机服务器上进行缓存/计算,那么您可能需要考虑一个不同的挑战,因为任何一台像样的计算机都可以在客户机端解决这个问题。