2013-07-24 3 views
2

Я искал эту ошибку и нашел много. к сожалению, ни одна нить не помогла мне.Другой std :: bad_alloc в ячейке памяти

У меня есть файлы изображений, которые я сохраняю в array или vector или что-то еще.

После приблизительно 1,8 ГБ (~ 1439 изображений) происходит ошибка std::bad_alloc в памяти. Поэтому я попытался объявить array по-разному, но каждый раз, когда возникает такая же ошибка.

Image* img; 
Image img[180000]; 
Image* img = new Image[180000] 

vector<Image> img; 

(180k будет 1 минута кадров). Его не очень важно записывать 1 минуту, но было бы неплохо сохранить более ~ 1439 кадров. Или, по крайней мере, понять, почему возникает эта ошибка или, скорее, она возникает при 1,8 ГБ.

Может быть, кто-нибудь может мне помочь или объяснить?

PS: Я использую 32bit System


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

Я слышал, что вы можете преобразовать изображение только в x и y "линии", которая содержит всю эту информацию. Но как это работает, это еще одна проблема.

Ответы от Марка Ингрэма были именно тем, что мне нужно для понимания проблемы. Спасибо за это

изменить: о, я вижу, я объяснил, что моя проблема не достаточно. У меня не было изображений и загружаю их в мою программу. У меня есть камера, которая записывает кадр с частотой 50 Гц, поэтому во время записи у меня нет времени для сохранения кадров.

+2

Существует не более 1,8 ГБ непрерывной памяти для размещения 'img [180000]'. Вот и все. – Jon

+2

Вам действительно нужны все изображения одновременно? – doctorlove

ответ

8

У вас закончилась память. В 32-битной системе (по крайней мере на Windows) вы можете выделить максимум до 2 ГБ памяти. Вам необходимо динамически загружать ваши данные только тогда, когда это необходимо, и когда вам больше не нужны данные изображения, выбросьте их снова.

В действительности, предел будет ниже 2 ГБ, так как память выделяется в блоках (т. Е. Не распределяется смежно). Это означает, что вы столкнетесь с фрагментацией кучи, если будете смешивать мелкие и большие объекты, и это значительно уменьшит объем памяти, который вы действительно можете выделить.

+0

Не так ли ближе к 4 ГБ? (2^32 = 4'294'967'296) – Dahaka

+4

@ Дахака Нет, в Windows вы можете выделить только 2 ГБ за один процесс. См. Здесь -> http://msdn.microsoft.com/en-us/library/windows/desktop/aa366778(v=vs.85).aspx (Ограничения памяти для выпуска Windows) –

0

Храните изображения в папке и загружайте их по одному. Динамическое распределение памяти - ваш друг.

Я ничего не мог придумать, выполнив загрузку 18 000 изображений вместе. Вы никогда не будете обрабатывать его даже на суперкомпьютере.

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