Почему размер вектора в оперативной памяти значительно больше, чем после сохранения на диск? QT
Я получаю по сокету данные несколько десятков раз в секунду, а именно структуру 140байт в виде QByteArray и помещаю это в вектор. Далее пишу содержимое в файл в другом классе(тоже в байтах). Проблема в том, что в оперативной памяти вектор занимает слишком много места(увеличивается на 50мб в минуту). Примерно в 10 раз больше, чем файл после записи на диск. Если же в к вектору применить vector.clear(); vector.squeeze(); то память освобождается. Но нужно решение по уменьшению объема в памяти, а не очищение.
socket.h
extern QVector<QByteArray> vector;
socket.cpp
QVector<QByteArray> vector;
//myStruct моя структура на 50+ элементов
QByteArray array = socket->read(sizeof(myStruct));
vector.push_back(array);
file.cpp
file.open(QIODevice::WriteOnly);
for (int i = 0; i<=vector.size()-1;i++)
{
myStruct* message = reinterpret_cast< myStruct*>(vector[i].data());
writeMessage = * message;
out << writeMessage;
}
file.close();
//writtenVector.clear();
//writtenVector.squeeze();
Ответы (2 шт):
Скорее всего дело в том, что вектор выделяет память с запасом (Резервирует). Например в STL-овском варианте вектора, он выделяет памяти в 2 раза больше. Не знаю, как в QVector, но скорее всего он выделяет тоже в 2 раза больше, чем нужно. Это резервирование нужно чтобы ускорить работу вектора, ведь выделение памяти довольно затратная операция. При этом не ясно - сколько нужно будет скопировать информации в новый кусок памяти. И если предыдущий кусок памяти весил 1 мегабайт, то вектору придётся довольно долго копировать всё это в новый кусок. Потому память выделяется с запасом.
Ещё: В следующий раз выкладывайте код полностью. Никто не хочет гадать как написан класс myStruct, что такое writeMessage, почему в socket.cpp не подключается файл socket.h и почему там же нет определения "vector" (Лучше назвать его иначе. Особенно если вы используете using namespace std, и у вас подключен vector) И вообще почему код просто так находиться в файле socket.cpp. Короче - вопросов очень много, и дать однозначный ответ из-за этого сложно. Выкладывайте код полностью
Проблема заключалась в том, что QByteArray array выделяет не sizeof(myStruct) в размере структуры(140Б), а по несколько Кб, в итоге в вектор помещался в разы больший объем. Применение squeeze() к qbytearray уменьшает размер до 140Б, после чего вектор выделяет память всего лишь вдвое больше этого размера, что приемлемо.
socket.cpp
QVector<QByteArray> vector;
//myStruct моя структура на 50+ элементов
QByteArray array = socket->read(sizeof(myStruct));
array.squeeze();
vector.push_back(array);