2015-06-04 2 views
1

Я пытаюсь создать базу данных изображений, совместимую с cPickle. Первоначально список пуст. Данные каждого изображения в каталоге добавляются как новая строка в список. Изображения 224x224. Размер изображений составляет в среднем 8 КБ. После загрузки около 10000 изображений мой компьютер зависает. Движения мыши отсутствуют. Ничего не произошло. требуется перезагрузка. Ниже фрагмент кода, который делает это ..Создание действительно больших списков Python

cr=csv.reader(open(csv_file,"rb")) 
    for row in cr: 
     print row[0], row[1] 
     try: 
      image=Image.open(row[0]+'.jpg').convert('LA') 
      pixels=[] 
      pixels=[f[0] for f in list(image.getdata())] 
      #pix=np.array(image) 
      dataset.append(pixels) 
      #dataset.append(pix) 
      labels.append(row[1]) 
      del image 

     except: 
      print("image not found") 

Я попытался уменьшения размера изображений до 28x28, и она работает. Но я не хочу уменьшать размер изображений. Я использую python 64-битный исполняемый файл. ОЗУ составляет 4 ГБ. Ubuntu 14.04. Я подозреваю, что это происходит из-за ограниченного пространства стека, и список занимает больше, чем доступное пространство стека. Если да, то как мне создать этот огромный список? есть ли какие-либо способы решения этой проблемы? Моя конечная цель - создать массив numpy с пиксельными данными в качестве его строк. В настоящее время я конвертирую список в массив numpy. Есть ли решение для этой проблемы?

+0

Не могли бы вы создать генератор, который дает кортеж метки и пикселей для каждого изображения. Чтобы вам никогда не приходилось создавать все данные в памяти сразу? –

+0

Я не могу воспроизвести вашу проблему, потому что у меня нет PIL. Но я думаю, что проблема в том, что JPG является сжатым форматом, и вы пытаетесь сохранить несжатый формат, который будет намного больше, чем 8K на изображение. – maxymoo

+0

Мне не нравятся такие ответы, как мои, но в целом вы должны избегать хранить все в памяти. Использовать генератор/открывать и закрывать файлы в цикле, не все сразу –

ответ

0

Если данные в конечном итоге будут массивом, возможно, попробуйте использовать numpy.memmap. Он работает как «обычные» массивы numpy, разница в том, что данные фактически хранятся на диске в двоичном формате. Только запрошенные куски массива помещаются в ОЗУ, таким образом, вы можете избавиться от своей проблемы.

Если размер массива данных определяется, вам просто нужно установить правильное измерение при создании объекта memmap. Если нет, проверьте numpy.memmap.resize, и вы все равно сможете его создать.

О, и есть другие решения, такие как PyTables.
Удачи!

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