SQL 是否是优化对一张大表的数据访问的好方法?

SQL 是否是优化对一张大表的数据访问的好方法?

TLDR;尝试访问一个巨大的数据表时,SQL 是可行的方法吗?

如标题所述。在天文学中,我们经常必须处理巨大的数据文件。通常,我们可以使用 Python 内部的不同优化方法来做到这一点。但是,RAM 不可避免地会耗尽,90GB 的 ASCII 文件会减慢或完全停止进度。除了几个小时的 YouTube 视频外,我对 SQL 没有任何经验。

到目前为止,我们已经处理过如下格式的文件:

# RA DEC umag uerr gmag gerr imag ierr Au Ag Ai dist dist_err [Fe/H] [Fe/H]_err
263.73815 -39.34179 22.866 0.229 19.830 0.007 17.064 0.016 4.682 3.738 2.030 8.731 0.858 -0.30 0.49
263.81260 -39.36577 22.640 0.037 19.964 0.003 17.220 0.007 5.204 4.154 2.256 8.754 0.886 -0.68 0.53
263.83048 -39.34130 22.891 0.451 20.358 0.000 17.639 0.006 5.073 4.050 2.200 10.951 1.150 -0.73 0.58
...

这里,每一行代表一个“星星”及其针对给定文件的测量值,如标题所示。我们有一个传入文件,其重量将超过 90 GB,我们需要为数据访问做好准备。我们通常使用 ASCII 表(或 ecsv)和 NumPy、AstroPy、Pandas 以及其他天体物理学中经常使用的库。ASCII 表还允许从终端使用 awk、cat 和其他类似命令。最重要的是,可以从记事本(或 vim/gedit)打开文件并查看是否需要参考。

我知道 SQL 是为关系数据库设计的,在表之间分散数据是一种很好的做法。但是,我认为像我们这样的表分开来没什么用,因为每颗恒星只有一组与之相关的值。庞大的天文数据库(例如盖亚) 使用 ADQL(SQL 的一种变体)来访问一个大表,但我认为这是有道理的,因为它们有大量数据,并且分布在多个列中,这些列可以通过 SQL 进行很好的过滤。然而,我们实际上不会超过 20 列,我们会使用所有列。

这些是我们在访问表时想要运行的操作类型:

  • 过滤行以仅显示具有给定范围的“umag”值的星号
  • 对值执行基本运算(例如 + 或 - 180)

将来(如果可行的话),我们可能会添加几个表,一些恒星将出现在不同的目录中。我们常做的一件事是搜索存在于两个或多个目录中的恒星。所以:

  • 获取表 1 和表 2 中存在的星星

访问数据后,我们需要使用 Python 处理数据,进行科学研究并制作图形。还有其他解决方案可以优化研究,例如仅使用 .fits 文件并深入研究我们已经使用的软件(例如 topcat)。因此:

  • 对于天文学领域来说,通过 SQL 查询访问和过滤数据的影响有多大(如上所述)?
  • 您会使用哪些因素来确定这种影响?
  • 将 90GB ASCII 表导入 SQL 服务器进行存储对硬件的要求有多高?这比将表单独存储为 fits(二进制)表并尝试直接对其进行操作更有效吗?

相关内容