2015-12-12 8 views
0

я написал некоторые данные в файл следующим образом:Считывание данных из файла занимает намного больше памяти, чем размер файла

result = new QHash<QPair<int, int>, QVector<double> >; 
QFile resfile("result.txt"); 
resfile.open(QIODevice::WriteOnly | QIODevice::Append); 
QDataStream out(&resfile); 
while(condition) 
{ 
QString s=" something"; 
out<<s; 
res->insert(QPair<int, int>(arange,trange),coeffs); 
out<<res; 
} 

Файл кончался с равным 484MB. После этого я прочитал в цикле:

QString s; 
QVector<QHash<QPair<int, int>, QVector <double> > > thickeness_result; 
QFile resfile("result.txt"); 
resfile.open(QIODevice::ReadOnly); 
QDataStream out(&resfile); 
while (!out.atEnd()) 
{ 
thickeness_result.resize(thickeness_result.size()+1); 
out>>s>>thickness_result.last(); 
} 

Хотя это прочитал цикл выполняется я вижу, что в диспетчере задач моя программа начинает принимать около 1300MB памяти и после этого я получаю «В текстовом файле \ qharfbuzzng .cpp, строка 626: Ошибка в памяти ". Мой вопрос: нормально ли, что программа начнет принимать более 2-х размеров файловой памяти, и я должен прочитать ее в кусках, или я делаю что-то неправильно?

ответ

0

ПРЕДУПРЕЖДЕНИЕ Все последующее предполагает, что QVector ведет себя как std::vector

Да, это нормально. Что происходит, когда у вас есть 1024 элемента и вы хотите прочитать другой, вызов resize выделяет емкость для 2048 элементов, перемещая первые 1024 элемента, а затем создавая 1025-й элемент. Он уничтожает старый массив и возвращает память в кучу (но не в операционную систему). Затем, когда вы приходите читать 2049-й элемент, он делает все это снова, только на этот раз выделяя 4096 элементов. В куче есть блок размером 1024 элемента, но это бесполезно, когда вы хотите 4096. Теперь у вас есть куски из 1024, 2048 и 4096 элементов в куче (две из которых свободны и доступны для повторного использования).

Повторяйте, пока не прочтете файл. Вы увидите, что в итоге вы удвоите размер файла.

Первое правило: «Не беспокойтесь об этом» - это обычно не проблема. Тем не менее, для вас это ясно.

Можете ли вы перейти на 64-битную программу? Это должно заставить проблему уйти.

Другой вариант - угадать, сколько у вас элементов (из размера файла) и вызвать .reserve на вектор в начале.

+0

Спасибо за ваше объяснение! Я постараюсь найти workarond =) – pr0r1der

+0

Резервирование не помогает в любом случае грустно. – pr0r1der

+0

В этом случае ваши варианты: конвертировать в 64 бит; читать в кусках. –