Javascript “创建数据”;瓷砖“;获取大量的价格数据

Javascript “创建数据”;瓷砖“;获取大量的价格数据,javascript,algorithm,charts,bigdata,Javascript,Algorithm,Charts,Bigdata,我正在设计一个JavaScript图表,我想成为一个了不起的人,我需要你的帮助 假设我有500万条记录,价格数据如下: open high low close volume timeStart timeEnd timeDuration 10 20 5 15 500 1391895920860 1391895920920 60 所以,我有500万条记录描述了某件东西在一分钟分辨率下的价格 现在,我需要向用户显示一张代表所有5

我正在设计一个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“tiles”,客户机可以快速下拉它。每个磁贴中都有1000条记录

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

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条记录。当他们放大一周瓷砖的一部分时,我会拉下三天瓷砖

这就是我需要帮助的地方。如果用户从1天缩放级别缩放到12小时分幅,我需要智能地知道我应该抓取哪一个12小时分幅。我认为我需要为我的磁贴制定一个命名方案,使客户能够轻松地识别任何父磁贴的子磁贴

有人能帮我为这些瓷砖命名吗?我特别需要:

  • 我将生成的所有分幅的文件命名方案
  • 图表将使用该算法轻松确定要放大的正确子图块或要缩小的父子图块

  • 希望听到您的想法和反馈

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

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

    对于非标准的“分辨率”(例如6小时分割),使用一个简单的模型更容易理解:普通分割

    • 添加:上下文。日期的“较大”单位部分
    • 股息:元素的一部分
    • 除数:除数的大小
    • 余数:分辨率的索引
    示例日期:2014年2月11日08:14 22'

    解决方案A

    只有一个较大的元素被分割。例如,在6小时分辨率中,只划分1天。其余的日子是“添加”或上下文

    第1层:

    Layer1/2014.csv
    
    第7层:

    Layer7/2014/41/1.csv
    
    Layer7/1414908000-1414929600.csv
    
    *41是一年中的一天

    解决方案B

    按时间戳范围分割

    第7层:

    Layer7/2014/41/1.csv
    
    Layer7/1414908000-1414929600.csv
    

    可以使用简单的栅格和z值进行缩放。然后可以使用四键来获得正确的平铺。在磁盘上,您可以使用x/y/z文件夹。一个很好的解释是Microsoft Bing地图平铺系统:。唯一的问题是地图是二维的,但你只有一维。

    这几乎取决于任何东西,而你对服务器端的评价也不多

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

    首先,你必须从某个地方开始。你最微小的数据,就是分钟。所以你必须知道会议记录的细节。这将使您不再需要等待毫秒。根据我的经验,具有一系列id的文件非常重要,就像
    23211239-23242175.csv
    文件一样。所以“瓷砖”是你的开始。我得到的id是变为分钟的
    毫秒/1000/60
    。我看到你的数据有时间范围,这是一个小问题。每一条记录都应该完全填入您的时间范围,就像您只需要关心
    timeEnd
    并将记录放入该时间范围一样

    要获得良好的I/O,请检查文件是否接近磁盘群集大小的倍数。对于windows,我认为它是4kb。群集大小是磁盘在一次I/O中返回的大小,假设您有两个csv,每个csv6kb。将每个文件放入内存需要2个I/O,因此您需要4个I/O才能放入2x6Kb文件。但是,如果将它们分成3个4kb,则需要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年的月份。所以这就像你最需要的一样