从FITS文件中仅提取几列,该文件可在线免费使用python下载

问题描述

我正在研究一个宇宙模型,我正在使用Sloan Digital Sky Survey网站上的可用数据。问题是某些文件的大小超过4GB(总计超过50GB),我知道这些文件包含很多数据列,但我只想从几列中获取数据。我听说过Web抓取,所以我想搜索一下该怎么做,但没有帮助,因为所有教程都解释了如何使用python下载整个文件。我想知道有什么方法可以从该文件中仅提取很少的列,以便仅获得所需的数据,而不必仅下载一小部分数据就下载整个larges文件吗? 抱歉,我的问题只是单词,没有代码,因为我不是python的专业人士。我只是在网上搜索并学习了如何进行基本的网页抓取,但并不能解决我的问题。 如果您可以向我提出更多减少我必须下载的数据大小的方法,它将对您有所帮助。

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

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

还有,是否可以对CSV文件执行相同的操作,或者对任何文件执行常规操作?

解决方法

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

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

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

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

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

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

更糟糕的是,我查看了您提供的链接,并且所有文件都经过gzip压缩,因此处理起来特别困难,因为您不知道不先解压缩就无法知道请求的范围。>

顺便说一句,正如您所问的那样,您将遇到与CSV相同的问题,但更糟糕的是,由于CSV字段通常不是固定宽度格式,因此无法知道如何在不下载整个列的情况下提取单个列文件。

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

您最好的选择是下载整个文件,从中提取所需的数据,并在不再需要的情况下删除原始文件。有可能您所需的信息也已经可以通过一些在线数据库访问。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...