Извлечение только нескольких столбцов из файла FITS, который находится в свободном доступе в Интернете для загрузки с использованием python

Я работаю над моделью Вселенной, для которой использую данные, доступные на сайте Sloan Digital Sky Survey. Проблема в том, что некоторые файлы имеют размер более 4 ГБ (всего более 50 ГБ), и я знаю, что эти файлы содержат много столбцов данных, но мне нужны данные только из нескольких столбцов. Я слышал о парсинге веб-страниц, поэтому решил поискать, как это сделать, но это не помогло, так как во всех руководствах объяснялось, как загрузить весь файл с помощью python. Я хочу знать, есть ли способ, с помощью которого я могу извлечь только несколько столбцов из этого файла, чтобы у меня были только те данные, которые мне нужны, и мне не пришлось загружать весь большой файл только для небольшой части его данных? Извините, мой вопрос - это просто слова, а не коды, потому что я не настолько профессионален в Python. Я просто искал в Интернете и узнал, как выполнять базовый веб-скрейпинг, но это не решило мою проблему.Будет еще полезнее, если вы предложите мне еще несколько способов уменьшить объем данных, которые мне придется загружать.

Вот URL-адрес для загрузки файлов FITS: https://data.sdss.org/sas/dr12/boss/lss/

Я хочу извлечь из файлов только столбцы с координатами (ra, dec), расстоянием, скоростью и красными смещениями.

Кроме того, есть ли способ сделать то же самое с файлами CSV или общий способ сделать это с любым файлом?

1 ответ

Решение

Боюсь, что то, о чем вы спрашиваете, обычно невозможно, по крайней мере, без значительных усилий и поддержки программного обеспечения как на стороне клиента, так и на стороне сервера.

Во-первых, то, как таблицы FITS хранятся в двоичном формате, ориентировано на строки, что означает, что если вы хотите передать часть таблицы FITS, вы можете читать ее по одной строке за раз. Но для чтения отдельных столбцов вам необходимо выполнять частичное чтение каждой строки для каждой отдельной строки в таблице. Некоторые веб-серверы поддерживают так называемые "запросы диапазона", что означает, что вы можете запрашивать только несколько диапазонов байтов из файла, а не весь файл. Это должно быть включено на веб-сервере, а не на всех серверах. Если бы таблицы FITS хранились ориентированными на столбцы, это было бы возможно, так как вы могли бы загрузить только заголовок файла, чтобы определить диапазоны столбцов, а затем загрузить только диапазоны для этих столбцов.

К сожалению, поскольку таблицы FITS ориентированы на строки, если вы хотите загрузить из нее, скажем, 3 столбца, а таблица содержит миллион строк, это потребует 3 миллиона запросов диапазона, которые, вероятно, потребуют достаточно накладных расходов, чтобы вы ничего не получили от это (и я, честно говоря, не уверен, какие ограничения накладывают веб-серверы на количество диапазонов, которые вы можете запросить в одном запросе, но я подозреваю, что большинство из них не допустят чего-то настолько экстремального.

Существуют и другие форматы астрономических данных (например, я думаю, таблицы CASA), которые могут хранить таблицы в формате, ориентированном на столбцы, и поэтому они более подходят для такого рода сценариев использования.

Кроме того, даже если бы ограничения HTTP можно было преодолеть, вам потребуется программная поддержка для загрузки файла таким образом. Это обсуждалось в ограниченной степени здесь, но по причинам, рассмотренным выше него будет в основном полезно для ограниченного набора случаев, таких как загрузка одного HDU в то время (не так полезно в вашем случае, если вся таблица в одном HDU) или, возможно, в некоторых других специализированных случаях, таких как разделы изображений, сжатых по тайловым фрагментам.

Как упоминалось в другом месте, Dask поддерживает загрузку двоичных массивов из различных облачных файловых систем, но когда дело доходит до потоковой передачи данных с произвольных HTTP-серверов, он сталкивается с аналогичными ограничениями.

Что еще хуже, я посмотрел на предоставленную вами ссылку, и все файлы там сжаты с помощью gzip, поэтому с этим особенно трудно иметь дело, поскольку вы не можете знать, какие диапазоны из них запрашивать, не распаковав их предварительно.

Кстати, раз уж вы спросили, у вас будет та же проблема с CSV, только хуже, поскольку поля CSV обычно не имеют формат фиксированной ширины, поэтому нет способа узнать, как извлечь отдельные столбцы, не загружая весь файл.

Для FITS, возможно, было бы полезно разработать веб-сервис, способный обслуживать произвольные выдержки из более крупных файлов FITS. Я не знаю, существует ли такая вещь уже, но я не думаю, что она существует в очень общем смысле. Таким образом, это необходимо: а) разработать, и б) попросить любого, кто размещает файлы, к которым вы хотите получить доступ, разместить такую ​​службу.

Лучше всего просто загрузить весь файл, извлечь из него нужные данные и удалить исходный файл, если он вам больше не нужен. Возможно, нужная вам информация уже доступна через какую-то онлайн-базу данных.

Другие вопросы по тегам