为大量价格数据创建数据“平铺”

时间:2014-02-08 22:02:50

标签: javascript algorithm charts bigdata

我正在设计一个我想要很棒的JavaScript图表,我需要你的帮助。

假设我有500万条记录,其价格数据如下:

open  high  low  close  volume  timeStart      timeEnd        timeDuration
10    20    5    15     500     1391895920860  1391895920920  60

所以,我有500万条记录描述了一分钟内某些东西的价格。

现在,我需要向用户显示一个图表,代表所有这500万条记录。默认情况下,图表将以一周的间隔显示2年的数据。一周间隔两年的数据仅为104条记录。因此,为了生成我的每周104条记录,我需要处理所有500万分钟记录,并将它们分组为几周。

假设用户放大并希望看到每三天分组的数据而不是一周的间隔。我将需要生成三天的记录,这些记录将我的一分钟分辨率数据中的数据分组。

事实上,对于我允许用户放大的每个间隔,我需要提前总结我的分钟分辨率数据。为了节省数据库的负担,我将生成客户端可以快速下拉的CSV“磁贴”。每个图块中都有1,000条记录。

以下是我将支持的分辨率(“缩放级别”)以及我需要在一分钟的分辨率下提前生成两年价格数据的数量:

1 minute - 1440 tiles (estimated to be about 40 MB of data)
3 minute - 480 tiles
5 minute - 288 tiles
15 minute - 96 tiles
30 minute - 48 tiles
1 hour - 24 tiles
2 hours - 12 tiles
4 hours - 6 tiles
6 hours - 4 tiles
12 hours - 2 tiles
1 day - 1 tile
3 days - 1 tile
1 week - 1 tile
1 month - 1 tile
1 year - 1 tile

这里的想法是,当用户第一次点击图表时,我需要做的就是下拉一周的图块,它将包含我的所有104条记录。当他们放大一周瓦片的一部分时,我将拉下3天的瓦片。

所以这是我需要帮助的地方。如果用户从1天缩放级别放大12小时图块,我需要智能地知道我应该抓住哪个12小时图块。我想我的瓷砖需要有一个命名方案,允许客户轻松识别任何父瓷砖的子瓷砖。

任何人都可以帮我这些瓷砖的命名方案吗?我特别需要:

  1. 我将生成的所有图块的文件命名方案
  2. 图表将使用的算法轻松识别要放大的正确子图块或父图像缩小到
  3. 很想听听您的想法和反馈!

3 个答案:

答案 0 :(得分:3)

这几乎取决于任何事情,而且你对服务器方面的描述并不多。

但是,您必须平衡之前计算的内容以及您现在计算的内容。之前占用空间并节省时间,现在需要时间并节省空间。你有快速的I / O(hdd / ssd / raid X)吗?你有足够的空间吗?你有强大的cpu吗?你的服务器处理好带宽吗?为什么每个磁贴应该有 1000 记录?什么是最流行的缩放级别?

首先,你必须从某个地方开始。你最微小的数据就是分钟。所以你必须有关于分钟的详细信息。这使你无法保持毫秒。根据我的经验,具有一系列id的文件是必不可少的,就像23211239-23242175.csv文件一样。所以“瓷砖”是你的开始。我得到的id是miliseconds/1000/60成为分钟。我看到你的数据有时间范围,这是一个小问题。每条记录都应完全填入您的时间范围,就像您应该只关心timeEnd并将记录放在该时间范围内。

要让好的I / O检查您的文件是否接近磁盘簇大小的倍数。对于Windows,我认为它是 4kb 。群集大小是磁盘在一个I / O中返回的大小,假设您有2个csv,每个csv 6kb 。它需要2个I / O才能将每个文件带到内存中,因此您需要 4 I / O 来带来 2x6Kb 文件。但是如果你将它们分成3个4kb中的3个,则需要 3个I / O 来将它们加载到内存中。因此,请检查这些图块是否真的接近簇大小。

看看你是否可以删除timeStart,timeEnd,timeDuration之类的字段,因为你的文件名将描述这些字段。尝试尽可能多地预先计算数据,以节省处理时间。根据缩放级别的详细信息,每个级别由前一级别计算。尝试创建通过下一级别的子文件夹。您不必计算每个缩放级别,尝试跳过一些,它将节省空间。然后根据请求,您将找到用户最想要的内容,如果不存在则创建它。有像这样的文件夹:

Path/1m/xxxxxxxx-xxxxxxx.csv
Path/30m/xxxxxxx-xxxxxx.csv
Path/6h/xxxxx-xxxxx.csv
Path/w/xx-xx.csv

确保您在开始时只有 1分钟文件,然后创建其他文件。我敢打赌,当你放大一个级别时,比如 2014 ,它会显示 2014年个月。因此,每张图表最多需要X个结果。因此,在每个缩放级别/文件夹中,您的图块可能不会具有相同的长度。这取决于他们描述的内容。然后,您可以轻松找到任何内容,只需检查文件描述的范围并将其返回。流行的分辨率可以缓存到内存中一段时间​​,以使输出过程更快。

在客户端,您应尽量保留尽可能多的数据。不要向服务器询问您之前再次获得的数据。 RAM缓存文件的问题是文件可能已过时,所以要小心。如果您观察过去一年的结果(因为它是此应用程序中最通用的分辨率级别,则说明年份),您应该知道新手不会影响这些旧字段,因此您可以安全地缓存它们。

此问题不仅仅出现在客户端编程上。要制作一个强大而高效的图表应用程序,您应该有一个很好的后端逻辑来完成它。即使我在这个问题中没有看到任何服务器标签(ror,nodejs,php),我也必须告诉这些...

答案 1 :(得分:1)

我会在图层中对数据进行建模。每分辨率一层。每一层都是独立的主格和功能。每个层使用相同的名称约定来保证系统稳定性。

如果您打算使用JavaScript,我会使用JavaScript日期约定(如果适用)。

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9

对于非标准"决议" (例如6小时除法)使用简单模型更容易理解:普通部门

  • 另外:上下文。"更大"单位部分日期。
  • 被分红:元素的部分
  • 除数:大小分部。
  • 余数:索引以获得解决方案。

日期示例:2014年2月11日08:14 22'。

解决方案A

只划分了一个更大的元素。例如,在6小时的分辨率中,仅分割1天。其余的日子是"添加"或上下文。

第1层:

Layer1/2014.csv

第7层:

Layer7/2014/41/1.csv

* 41是一年中的某一天。

解决方案B

按时间戳范围拆分。

第7层:

Layer7/1414908000-1414929600.csv

答案 2 :(得分:1)

您可以使用简单的网格和z值进行缩放。然后,您可以使用四元组来获得正确的图块。在磁盘上,您可以使用x / y / z文件夹。一个很好的解释是Microsoft Bing地图平铺系统:http://msdn.microsoft.com/en-us/library/bb259689.aspx。唯一的问题是地图是2维,但你只有1维。