0

我正在研究一个宇宙模型,我正在使用 Sloan Digital Sky Survey 网站上提供的数据。问题是一些文件超过 4GB(总共超过 50GB),我知道这些文件包含很多数据列,但我只想要来自少数列的数据。我听说过网络抓取,所以我想搜索如何做到这一点,但这并没有帮助,因为所有教程都解释了如何使用 python 下载整个文件。我想知道有没有什么方法可以从该文件中只提取几列,这样我就只有我需要的数据,而我不必只为一小部分数据下载整个大型文件?抱歉,我的问题只是文字,没有代码,因为我不是 python 的专业人士。我只是在网上搜索并学习了如何进行基本的网络抓取,但这并没有解决我的问题。

这是下载 FITS 文件的 URL:https ://data.sdss.org/sas/dr12/boss/lss/

我只想从文件中提取具有坐标(ra、dec)、距离、速度和红移的列。

另外,有没有办法对 CSV 文件做同样的事情,或者用一般的方法对任何文件做同样的事情?

4

1 回答 1

1

恐怕您要问的问题通常是不可能的,至少在客户端和服务器端都付出了巨大的努力和软件支持。

首先,FITS 表以二进制形式存储的方式是面向行的,这意味着如果您想流式传输 FITS 表的一部分,您可以一次读取一行。但是要读取单个列,您需要对表中的每一行的每一行进行部分读取。一些 Web 服务器支持所谓的“范围请求”,这意味着您只能从文件中请求几个字节范围,而不是整个文件。Web 服务器必须启用此功能,并非所有服务器都这样做。如果 FITS 表是面向列存储的,这可能是可行的,因为您可以只下载文件的标题以确定列的范围,然后只下载这些列的范围。

不幸的是,由于 FITS 表是面向行的,如果您想从中加载 3 列,并且该表包含一百万行,这将涉及 300 万个范围请求,这可能会涉及足够的开销,您不会从中获得任何收益它(老实说,我不确定 Web 服务器对您可以在单个请求中请求多少范围的限制,但我怀疑大多数不会允许如此极端的事情。

还有其他天文学数据格式(例如我认为 CASA 表)可以以面向列的格式存储表,因此对于这种用例来说更可行。

此外,即使可以克服 HTTP 限制,您也需要软件支持才能以这种方式加载文件。此处已对此进行了有限程度的讨论,但由于上述原因,它主要用于一组有限的情况,例如一次加载一个 HDU(如果整个表都在一个 HDU 中,则对您的情况没有太大帮助) 或其他一些特殊情况,例如切片压缩图像的部分。

正如在其他地方提到的,Dask支持从各种基于云的文件系统加载二进制数组,但是当涉及到来自任意 HTTP 服务器的流数据时,它会遇到类似的限制。

更糟糕的是,我查看了您提供的链接以及那里的所有文件都是 gzip 压缩的,因此处理起来特别困难,因为如果不先解压缩它们,您无法知道要请求的范围。

顺便说一句,既然你问了,你会遇到与 CSV 相同的问题,更糟糕的是,因为 CSV 字段通常不是固定宽度格式,所以没有办法知道如何在不下载整个文件的情况下提取单个列。

对于 FITS,开发一个能够从较大的 FITS 文件中提供任意提取的 Web 服务可能会有所帮助。如果这样的事情已经存在我不知道,但我认为它不存在于非常普遍的意义上。因此,这将 a)必须开发,并且 b)您必须询问托管您要访问的文件的任何人以托管此类服务。

你最好的办法是下载整个文件,从中提取你需要的数据,然后假设你不再需要它,删除原始文件。您需要的信息也可能已经可以通过一些在线数据库访问。

于 2020-08-31T09:24:45.727 回答