2016-11-02 16 views
1

Я попытался открыть большой IDL сгенерированный куб FITS данных (159,2,4096,4096): Произошлаоткрытие Python ошибка большие припадки данные размера буфера

In [37]: hdulist = fits.open('/randpath/randname1.fits') 

In [38]: hdulist.info() 
Filename: /randpath/randname1.fits 
No. Name   Type  Cards Dimensions Format 
0 PRIMARY  PrimaryHDU  11 (159, 2, 4096, 4096) float32 

In [39]: scidata = hdulist[0].data 

следующая ошибка:

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-39-d492d4e07eb1> in <module>() 
----> 1 scidata = hdulist[0].data 

/opt/local/anaconda/anaconda-2.2.0/lib/python2.7/site-packages/astropy/utils/decorators.py in __get__(self, obj, owner) 
    513    return obj.__dict__[self._key] 
    514   except KeyError: 
--> 515    val = self.fget(obj) 
    516    obj.__dict__[self._key] = val 
    517    return val 

/opt/local/anaconda/anaconda-2.2.0/lib/python2.7/site-packages/astropy/io/fits/hdu/image.py in data(self) 
    206    return 
    207 
--> 208   data = self._get_scaled_image_data(self._data_offset, self.shape) 
    209   self._update_header_scale_info(data.dtype) 
    210 

/opt/local/anaconda/anaconda-2.2.0/lib/python2.7/site-packages/astropy/io/fits/hdu/image.py in _get_scaled_image_data(self, offset, shape) 
    619   code = BITPIX2DTYPE[self._orig_bitpix] 
    620 
--> 621   raw_data = self._get_raw_data(shape, code, offset) 
    622   raw_data.dtype = raw_data.dtype.newbyteorder('>') 
    623 

/opt/local/anaconda/anaconda-2.2.0/lib/python2.7/site-packages/astropy/io/fits/hdu/base.py in _get_raw_data(self, shape, code, offset) 
    566        offset=offset) 
    567   elif self._file: 
--> 568    return self._file.readarray(offset=offset, dtype=code, shape=shape) 
    569   else: 
    570    return None 

/opt/local/anaconda/anaconda-2.2.0/lib/python2.7/site-packages/astropy/io/fits/file.py in readarray(self, size, offset, dtype, shape) 
    272 
    273    return np.ndarray(shape=shape, dtype=dtype, offset=offset, 
--> 274        buffer=self._mmap) 
    275   else: 
    276    count = reduce(lambda x, y: x * y, shape) 

TypeError: buffer is too small for requested array 

усредненный массив (2,4096,4096) работает хорошо:

In [40]: hdulist2 = fits.open('/randpath/randname1avg.fits') 

In [41]: hdulist2.info() 
Filename: /randpath/randname1avg.fits 
No. Name   Type  Cards Dimensions Format 
0 PRIMARY  PrimaryHDU  10 (2, 4096, 4096) float32 

In [42]: scidata2 = hdulist2[0].data 

Любые идеи? Кажется, что размер по какой-то причине имеет значение. MATLAB не может открыть первый файл для подгонки:

Warning: Seek failed, 'Offset is bad - after end-of-file or last character written.'. File may be an 
invalid FITS file or corrupt. Output structure may not contain complete file information. 
> In fitsinfo>skipHduData (line 721) 
    In fitsinfo (line 226) 
    In fitsread (line 99) 
Error using fitsiolib 
CFITSIO library error (108): error reading from FITS file 

Error in matlab.io.fits.readImg (line 85) 
imgdata = fitsiolib('read_subset',fptr,fpixel,lpixel,inc); 

Error in fitsread>read_image_hdu (line 438) 
    data = fits.readImg(fptr); 

Error in fitsread (line 125) 
     data = read_image_hdu(info,1,raw,pixelRegion); 

IDL может по непонятным причинам. Существует ли ограничение на размер массива при запуске рабочего процесса astropy.io? Случайные матрицы одного размера могут быть созданы без проблем. В настоящее время я работаю на машине с 256 ГБ оперативной памяти, поэтому память не должна играть роль, не так ли? Спасибо за помощь!

Обновления: первый раз hdulist загружается Python на самом деле дает некоторое полезное сообщение об ошибке:

ПРЕДУПРЕЖДЕНИЕ: Файл может быть сокращен: фактическая длиной файла (4160755136) меньше ожидаемого размера (21340624320) [ astropy.io.fits.file] Действительно, размер файла составляет всего 3,9 ГБ вопреки ожидаемому ~ 20 ГБ. Мне придется дважды проверять (не иметь большого опыта работы с IDL), но по какой-то причине он (writefits) не может правильно создать файл fits.

Обновление 2: Проблема решена. IDL 6.2 (старая версия, установленная на машине), по-видимому, не может обрабатывать слишком большие файлы, IDL 8.3 (который также установлен) может. Не знаю, почему.

+1

Быстрый поиск основного сообщения об ошибке «TypeError: буфер слишком мал для запрошенного массива» предполагает, что эта ошибка может появиться, когда файл поврежден; само по себе, когда он слишком велик (несмотря на то, что в этих случаях вводит в заблуждение сообщение об ошибке). MATLAB, похоже, так же думает: файл FITS поврежден. Посмотрите, можете ли вы открыть его в другом читателе FITS (например, 'fv', если он у вас есть), или попытайтесь использовать [' fitsverify'] (https://heasarc.gsfc.nasa.gov/docs/software/ftools/fitsverify /). Но на самом деле это звучит как IDL, испорченный при записи файла на диск. Возможно, попробуйте другой формат, например. HDF5? – Evert

+0

"размер файла составляет всего 3,9 ГБ вопреки ожидаемому ~ 20 ГБ": это просто кричит 32-разрядный (размер указателя). – Evert

ответ

2

Проблема связана с IDL 6.2 и больше не появляется в IDL 8.3. Таким образом, этого можно избежать, используя текущие версии IDL для генерации файла fits.

+0

Похоже, что файл поврежден каким-то образом, так как вы нашли использование обновленного IDL. Я предполагаю, что он исправил, какая ошибка вызвала поврежденный вывод (при этом говорилось, что это слишком плохо. Астропит не обнаружил это чисто и дал лучшую ошибку - это помогло бы, если бы вы открыли проблему в github Astropy и предоставили ссылку на файл примера, который показывает проблему). – Iguananaut

 Смежные вопросы

  • Нет связанных вопросов^_^