什么是存储栅格数据的好方法?
我在或者多或者少的地理参考网格上存储了各种时间序列数据,例如每0.2纬度和经度一个值。当前数据存储在文本文件中,因此在251年的一天中,我们可能会看到:
251 12.76 12.55 12.55 12.34 [etc., 200 more values...] 13.02 12.95 12.70 12.40 [etc., 200 more values...] [etc., 250 more lines] 252 [etc., etc.]
我想提高抽象水平,提高性能,并减少脆弱性(例如,当前代码无法在两个现有代码之间插入一天!)。我们搞砸了BLOB-y RDBMS hack,甚至将文本文件格式的每一行复制为表中的一行(每个时间戳/纬度对一行,每经度增量一行-yecch!)。
我们可以去一个"真实的"地理数据库,但是用lat和long标记每个值的开销似乎太高了。数据的大小和分辨率十年来都没有改变,而且不太可能改变。
我一直在忙于将所有内容都放入NetCDF文件中,但是认为我们需要完全摆脱文件的观念-我讨厌我所有的软件都必须从日期中找出文件名,并处理多个文件,等等。另一种选择是将所有十年(并正在计数)的数据放入一个文件,这似乎也不可行。
有什么好主意或者产品吗?
解决方案
回答
我肯定会从文本更改为二进制文件,但仍将每一天保存在单独的文件中。我们可以使用以下方式命名它们:中间的插入不会对索引造成任何奇怪的影响,例如在文件名中包括日期和可能的时间。例如,如果每个位置有多个字段,则也可以考虑文件结构。从大量的时间步长中寻找一块小瓷砖是否很常见?在这种情况下,我们可能希望将它们存储为包含几天数据的图块。我们没有提到如何访问数据,这在如何有效地组织数据方面起着重要作用。
回答
说明:
我很惊讶我们将"数据库"添加为标签之一,并认为它是一个选项。你为什么这么做?
本质上,每个时间步上都有一个二维的单分量浮点图像。我们是否同意这种查看数据的方式?
我们还提到了在两个现有日期之间插入一天的愿望,这似乎很奇怪。我们为什么需要这样做?我不知道5月4日至5月5日之间有新的一天吗?
"压缩"是我们关心的事情之一,还是只是讨厌平面文件?
浮点数或者双精度数足以存储数据,还是我们觉得需要更高的任意精度?
另外,我们想使用哪种编程语言访问此数据?
回答
我们对如何存储数据的答案完全取决于我们对数据的处理方式。例如,如果我们只需要通过指定日期或者日期范围进行检索,那么将数据库存储为BLOB就是很有意义的。但是如果我们需要查找具有某些值的记录,则需要做一些不同的事情。
请说明我们需要如何访问数据/
回答
我在这里整理了评论:
- 我想做所有这些"不写自己的文件I / O代码"
- 我需要从" Java Ruby MATLAB"和" FORTRAN例程"进行访问
当我们添加这些时,我们绝对不希望使用新的文件格式。坚持使用我们拥有的那个。
如果我们可以让我们放松第一个要求,即,如果我们愿意编写自己的文件I / O代码,那么这里有一些有趣的选择。我会编写C ++类,并使用SWIG之类的东西使新类可用于所需的多种语言。 (但是我不确定我们是否可以使用SWIG来访问Java,Ruby,MATLAB和FORTRAN。我们可能还需要其他功能。我自己不确定该怎么做。)
我们还说:"实际上,如果我必须拥有文件,我更喜欢文本,因为这样我就可以在需要时手动进行编辑。"
我认为这是一个误导性陈述。如果我们愿意创建自己的文件I / O例程,那么我们可以做很多非常聪明的事情...作为最终的备用,我们可以给自己一个工具,将新文件格式转换为旧文件格式习惯的文本格式...以及另一种可以转换回来的工具。我将在帖子结尾再讨论这个问题...
我们说了一些我想解决的问题:
"利用40年的数据库优化"
数据库用于关系数据,而不是栅格数据。我们将不会利用此类数据来利用任何人的数据库优化。我们也许可以将数据填充到数据库中,但这几乎不是一回事。
根据我们告诉我们的所有内容,这是我能告诉最有用的信息。我们说的是:
"尽管执行速度很好,但我对优化时间的兴趣远胜于CPU的时间!"
坦白地说,这将需要工具。停止将其视为文本文件。开始思考我们要做的常见任务,并在"无论哪种语言"中编写小型工具,使这些事情都可以尝试。
而且,如果工具表现出糟糕的性能?猜猜是什么原因,因为纯文本文件是粗糙的格式。但那只是我的个人意见。 :)
回答
马特(Matt),非常感谢。
这篇文章部分是一个实验,测试了stackoverflow话语的质量。如果你们/女孩/外星人的生活形式具有代表性,我就被卖了。
至此,我们已经相当清楚地阐明了我的想法。介意,我仍然不一定执行建议,但知道我会非常认真地考虑它。 > ;-)
我可能会很好地保持文件格式不变,添加到现有的C和/或者Ruby例程中以解决我缺少的一些低级功能(例如,插入缺少的时间步长),并将HTTP前端挂在整个东西上数据可以由任何需要的盒子使用,无论当前使用哪种语言。尽管构建这些数据的大多数传统软件都保持不变,但我们总是为此寻找新的用户,因此多语言/多计算机要求(哎呀,我忘了吗?)适用于阅读方面,而不是写作方面。这也消除了很多安全问题。
再次感谢大家。