使用 python 从可在线免费下载的 FITS 文件中仅提取几列
Extracting only few columns from a FITS file that is freely available online to download using python
我正在研究一个宇宙模型,为此我使用了 Sloan Digital Sky Survey 网站上提供的数据。问题是有些文件超过 4GB(总计超过 50GB),我知道这些文件包含很多数据列,但我只想要来自少数列的数据。我听说过网络抓取,所以我想搜索如何做,但没有帮助,因为所有教程都解释了如何使用 python 下载整个文件。我想知道有什么方法可以让我只从该文件中提取几列,这样我就只有我需要的数据,而不必为了一小部分数据而下载整个大文件?
抱歉,我的问题只是文字,没有代码,因为我在 python 方面不是那么专业。我只是在网上搜索并学习了如何进行基本的网络抓取,但这并没有解决我的问题。
如果您能建议我一些更多的方法来减少我必须下载的数据量,那将会更有帮助。
这里是URL下载FITS文件:https://data.sdss.org/sas/dr12/boss/lss/
我只想从文件中提取具有坐标 (ra, dec)、距离、速度和红移的列。
另外,有没有一种方法可以对 CSV 文件做同样的事情,或者有一种通用的方法可以对任何文件做同样的事情?
恐怕你所问的通常是不可能的,至少在客户端和服务器端都需要大量的努力和软件支持是不可能的。
首先,FITS table 以二进制形式存储的方式是 row-oriented 这意味着如果您想流式传输 FITS table 的一部分,您可以一行读取它一次。但是要读取单独的列,您需要对 table 中的每一行的每一行进行部分读取。一些 Web 服务器支持所谓的“范围请求”,这意味着您只能从文件中请求几个字节范围,而不是整个文件。 Web 服务器必须启用此功能,但并非所有服务器都启用。如果 FITS tables 被存储 column-oriented 这可能是可行的,因为您可以只下载文件的 header 以确定列的范围,然后只下载这些列的范围列。
不幸的是,由于 FITS table 是 row-oriented,如果您想从中加载 3 列,而 table 包含一百万行,则将涉及 300 万行范围请求可能会涉及足够的开销,你不会从中获得任何东西(老实说,我不确定网络服务器对你在单个请求中可以请求的范围有什么限制,但我怀疑大多数不会允许某些东西太极端了。
还有其他天文数据格式(例如我认为是 CASA 表)可以以 column-oriented 格式存储 tables,因此对于这种用例更可行。
此外,即使可以克服 HTTP 限制,您也需要软件支持才能以这种方式加载文件。这已经在有限的范围内进行了讨论 here 但由于上述原因,它主要用于有限的一组情况,例如一次加载一个 HDU(如果整个 table 在一个 HDU 中)或可能是其他一些特殊情况,例如 tile-compressed 图像的部分。
如其他地方所述,Dask 支持从各种 cloud-based 文件系统加载二进制数组,但是当涉及到来自任意 HTTP 服务器的流数据时,它会遇到类似的限制。
更糟的是,我看了你提供的link,里面所有的文件都是gzip-compressed,所以特别难处理,因为你不知道它们的范围请求而不先解压。
顺便说一句,既然你问过,你也会遇到与 CSV 相同的问题,更糟糕的是因为 CSV 字段通常不是 fixed-width 格式,所以没有办法知道如何提取单个列无需下载整个文件。
对于 FITS,开发一个能够从较大的 FITS 文件中任意提取的 Web 服务可能会有所帮助。我不知道这样的事情是否已经存在,但我不认为它在非常普遍的意义上存在。所以这将 a) 必须开发,并且 b) 你必须要求任何托管你想要访问的文件的人来托管这样的服务。
你最好的办法是下载整个文件,从中提取你需要的数据,如果你不再需要它,就删除原始文件。您需要的信息也可能已经可以通过某些在线数据库访问。
我正在研究一个宇宙模型,为此我使用了 Sloan Digital Sky Survey 网站上提供的数据。问题是有些文件超过 4GB(总计超过 50GB),我知道这些文件包含很多数据列,但我只想要来自少数列的数据。我听说过网络抓取,所以我想搜索如何做,但没有帮助,因为所有教程都解释了如何使用 python 下载整个文件。我想知道有什么方法可以让我只从该文件中提取几列,这样我就只有我需要的数据,而不必为了一小部分数据而下载整个大文件? 抱歉,我的问题只是文字,没有代码,因为我在 python 方面不是那么专业。我只是在网上搜索并学习了如何进行基本的网络抓取,但这并没有解决我的问题。 如果您能建议我一些更多的方法来减少我必须下载的数据量,那将会更有帮助。
这里是URL下载FITS文件:https://data.sdss.org/sas/dr12/boss/lss/
我只想从文件中提取具有坐标 (ra, dec)、距离、速度和红移的列。
另外,有没有一种方法可以对 CSV 文件做同样的事情,或者有一种通用的方法可以对任何文件做同样的事情?
恐怕你所问的通常是不可能的,至少在客户端和服务器端都需要大量的努力和软件支持是不可能的。
首先,FITS table 以二进制形式存储的方式是 row-oriented 这意味着如果您想流式传输 FITS table 的一部分,您可以一行读取它一次。但是要读取单独的列,您需要对 table 中的每一行的每一行进行部分读取。一些 Web 服务器支持所谓的“范围请求”,这意味着您只能从文件中请求几个字节范围,而不是整个文件。 Web 服务器必须启用此功能,但并非所有服务器都启用。如果 FITS tables 被存储 column-oriented 这可能是可行的,因为您可以只下载文件的 header 以确定列的范围,然后只下载这些列的范围列。
不幸的是,由于 FITS table 是 row-oriented,如果您想从中加载 3 列,而 table 包含一百万行,则将涉及 300 万行范围请求可能会涉及足够的开销,你不会从中获得任何东西(老实说,我不确定网络服务器对你在单个请求中可以请求的范围有什么限制,但我怀疑大多数不会允许某些东西太极端了。
还有其他天文数据格式(例如我认为是 CASA 表)可以以 column-oriented 格式存储 tables,因此对于这种用例更可行。
此外,即使可以克服 HTTP 限制,您也需要软件支持才能以这种方式加载文件。这已经在有限的范围内进行了讨论 here 但由于上述原因,它主要用于有限的一组情况,例如一次加载一个 HDU(如果整个 table 在一个 HDU 中)或可能是其他一些特殊情况,例如 tile-compressed 图像的部分。
如其他地方所述,Dask 支持从各种 cloud-based 文件系统加载二进制数组,但是当涉及到来自任意 HTTP 服务器的流数据时,它会遇到类似的限制。
更糟的是,我看了你提供的link,里面所有的文件都是gzip-compressed,所以特别难处理,因为你不知道它们的范围请求而不先解压。
顺便说一句,既然你问过,你也会遇到与 CSV 相同的问题,更糟糕的是因为 CSV 字段通常不是 fixed-width 格式,所以没有办法知道如何提取单个列无需下载整个文件。
对于 FITS,开发一个能够从较大的 FITS 文件中任意提取的 Web 服务可能会有所帮助。我不知道这样的事情是否已经存在,但我不认为它在非常普遍的意义上存在。所以这将 a) 必须开发,并且 b) 你必须要求任何托管你想要访问的文件的人来托管这样的服务。
你最好的办法是下载整个文件,从中提取你需要的数据,如果你不再需要它,就删除原始文件。您需要的信息也可能已经可以通过某些在线数据库访问。