Чтение двоичной таблицы FITS по одной строке за раз, используя pyfits
У меня есть файл FITS 60 ГБ, содержащий двоичную таблицу. Я хотел бы прочитать (и обработать) эту таблицу по одной строке / записи / строке / блоку * за раз.
(* Я не уверен в правильной номенклатуре)
Я использую pyfits, и то, что я хотел бы сделать, сводится к просто:
import pyfits
hdulist = = pyfits.open("file.fits")
# the binary table has to be in the 2nd extension
# hence it is in hdulist[1]
n_entries = hdulist[1].header['NAXIS2']
for i in xrange(n_entries):
entry = hdulist[1].data[i] # I am confused what happens at this step
# now do stuff with the values in entry
# .....
Переменная entry
имеет тип <class 'pyfits.fitsrec.FITS_record'>
и имеет длину, равную количеству столбцов в двоичной таблице. Однако, похоже, что вся двоичная таблица считывается в память в этой строке: entry = hdulist[1].data[i]
,
Я просмотрел документацию по pyfits, но не могу найти какие-либо методы, которые, по-видимому, читают данные из расширения двоичной таблицы на основе записи таблицы (или небольших наборов записей за раз). Я не хочу выбирать определенные записи из таблицы, просто просматриваю их по порядку.
Я думаю, мои вопросы:
0) Что происходит на hdulist[1].data[i]
шаг? Почему все читается в память? (есть ли способ обойти это?)
1) Я что-то пропустил и могут ли pyfits делать то, что я хочу?
2) Есть ли другая библиотека Python, которая будет? (т.е. используя двоичную таблицу в расширении FITS)
3) Если нет, могу ли я переписать данные в другом двоичном (или другом сжатом / не ascii) формате (который не является FITS) и найти какую-нибудь другую библиотеку или модуль python, чтобы делать то, что я хочу?
1 ответ
В настоящее время в pyfits отсутствует итератор строк для таблиц. Если столбцы данных таковы, что они не требуют преобразования из формата на диске в их "физические" значения, тогда чтение таблиц происходит быстро. Но в противном случае он в настоящее время взрывается, если вы пытаетесь читать такие столбцы. Я бы не стал слишком сильно бороться с этим, поскольку интерфейс таблицы переписывается, но в то же время вы можете попробовать библиотеку fitsio, которая является оболочкой Python для CFITSIO и обеспечивает эффективную итерацию таблиц на основе строк.