Russian Qt Forum
Ноябрь 23, 2024, 14:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 3 4 [5] 6 7   Вниз
  Печать  
Автор Тема: QSqlQuery+QThread = bad_alloc  (Прочитано 43548 раз)
cdsmika
Гость
« Ответ #60 : Май 19, 2014, 17:27 »

так ты говорил в основном потоке все ок  Непонимающий
У меня шляпа была со setStackSize
Записан
cdsmika
Гость
« Ответ #61 : Май 19, 2014, 17:29 »

так ты говорил в основном потоке все ок  Непонимающий
У меня шляпа была со setStackSize
Поток, не поток - одинаково. QSqlQuery аллоциорать мои данные отказывается
Записан
OKTA
Гость
« Ответ #62 : Май 19, 2014, 17:45 »

В одной только записи уже 248 метров лежит?
Записан
cdsmika
Гость
« Ответ #63 : Май 19, 2014, 17:49 »

В одной только записи уже 248 метров лежит?
ога
Записан
cdsmika
Гость
« Ответ #64 : Май 19, 2014, 17:49 »

В одной только записи уже 248 метров лежит?
ога
там FOR xml
Записан
cdsmika
Гость
« Ответ #65 : Май 19, 2014, 19:00 »

Короче поток тут не причем
Скорее всего дело в append, как и говорили.
Код:
try
    {
        char * d = new char[1700000000];

        for (int i= 0; i < 1700000000- 1; ++i)
        {
            d[i] = 1;
        }
        delete[] d;
    }
    catch(std::bad_alloc)
    {
        qDebug() << "bad_alloc";
    }
все круто
Код:
try
    {
        QString l;

        while (l.length() < 300000000)
        {
            l.append("111111");
        }
    }
    catch(std::bad_alloc)
    {
        qDebug() << "bad_alloc";
    }
песта ((( QSqlQuery::value дает тот же результат - падает с bad_alloc
« Последнее редактирование: Май 19, 2014, 19:08 от cdsmika » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #66 : Май 19, 2014, 20:38 »

Короче поток тут не причем
Скорее всего дело в append, как и говорили.
Код:
try
    {
        char * d = new char[1700000000];

        for (int i= 0; i < 1700000000- 1; ++i)
        {
            d[i] = 1;
        }
        delete[] d;
    }
    catch(std::bad_alloc)
    {
        qDebug() << "bad_alloc";
    }
все круто
Код:
try
    {
        QString l;

        while (l.length() < 300000000)
        {
            l.append("111111");
        }
    }
    catch(std::bad_alloc)
    {
        qDebug() << "bad_alloc";
    }
песта ((( QSqlQuery::value дает тот же результат - падает с bad_alloc

Код:
        while (l.length() < 300000000)
        {
            l.append("111111");
        }
Можно примерно подсчитать во сколько нам обойдется такой цикл:
"111111" = 12 байт
300000000 * 12 = 3600000000 байт = 3515625 кбайт = 3433,2275390625 мбайт = 3,35276126861572265625 гбайт
Если памяти будет не хватать, новую нельзя выделять

У вас оперативной памяти то хватит? Улыбающийся
Записан

m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #67 : Май 19, 2014, 20:54 »

Цитировать
300000000 * 12
Во-первых не на 12, а на 2 (sizeof(QChar)) + ещё некоторый процент на резерв.

Во-вторых, скажите, в чём разница между списком и вектором?)
« Последнее редактирование: Май 19, 2014, 20:56 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #68 : Май 19, 2014, 21:15 »

Цитировать
300000000 * 12
Во-первых не на 12, а на 2 (sizeof(QChar)) + ещё некоторый процент на резерв.
"111111" - 6 символов, а т.к. это QString, то на один символ отделяется 2 байта, потому и 12 написал
Как я писал выше, это все примерно

Во-вторых, скажите, в чём разница между списком и вектором?)
Вектор - тот же сишный массив. В векторе данные хранятся последовательно.
Вектор - контейнер с произвольным доступом, лист - с последовательным.
Различаются разной скоростью получения элемента по индексу, а также вставкой и удалением элементов
Записан

m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #69 : Май 19, 2014, 21:23 »

Цитировать
"111111" - 6 символов, а т.к. это QString, то на один символ отделяется 2 байта, потому и 12 написал
Понимаю, понедельник - день тяжёлый)
Код
C++ (Qt)
l.length() == 300000000 -1
 
В строке l (300000000 - 1) элементов QChar

Цитировать
Вектор - тот же сишный массив. В векторе данные хранятся последовательно.
Вектор - контейнер с произвольным доступом, лист - с последовательным.
Различаются разной скоростью получения элемента по индексу, а также вставкой и удалением элементов
Иии?

В чём ещё различие?)
Т.е., что происходит, когда в вектор добавляется элемент и что происходит со списком?)
« Последнее редактирование: Май 19, 2014, 21:29 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #70 : Май 19, 2014, 21:57 »

Цитировать
"111111" - 6 символов, а т.к. это QString, то на один символ отделяется 2 байта, потому и 12 написал
Понимаю, понедельник - день тяжёлый)
Код
C++ (Qt)
l.length() == 300000000 -1
 
В строке l (300000000 - 1) элементов QChar
Тьфу, не обратил внимание Улыбающийся

Т.е., что происходит, когда в вектор добавляется элемент и что происходит со списком?)
У списка создается новая вершина, которая хранит добавленного значение, эта вершина указывает на вершины слева и справа (двусвязный список)
У вектора сложнее - есть добавляется элемент в конец, тогда происходит перевыделение размера матрицы и элемент устанавливает в конец, если добавлятся в любое другое место вектора, то также выделяется место под добавляемый элемент, вот только перед вставкой, нужно все элементы справа от вставляемой позиции, передвинуть вправо, у списка бы просто нужны было поменять указатели вершин

Для вас проще было открыть вики и посмотреть там отличия массивов и списков Улыбающийся
« Последнее редактирование: Май 19, 2014, 22:06 от gil9red » Записан

OKTA
Гость
« Ответ #71 : Май 19, 2014, 22:00 »

Лучше распишите формулу расчета нового размера для вектора или QString при добавлении элементов, которые не вместятся в текущий  Подмигивающий
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #72 : Май 19, 2014, 22:07 »

Лучше распишите формулу расчета нового размера для вектора или QString при добавлении элементов, которые не вместятся в текущий  Подмигивающий

Наслаждайтесь Улыбающийся Как говорится - из первых рук Улыбающийся Еще горячий ))
Код:
QString &QString::append(const QString &str)
1871 {
1872     if (str.d != Data::sharedNull()) {
1873         if (d == Data::sharedNull()) {
1874             operator=(str);
1875         } else {
1876             if (d->ref.isShared() || uint(d->size + str.d->size) + 1u > d->alloc)
1877                 reallocData(uint(d->size + str.d->size) + 1u, true);
1878             memcpy(d->data() + d->size, str.d->data(), str.d->size * sizeof(QChar));
1879             d->size += str.d->size;
1880             d->data()[d->size] = '\0';
1881         }
1882     }
1883     return *this;
1884 }
Записан

OKTA
Гость
« Ответ #73 : Май 19, 2014, 22:32 »

А вот и нет  Смеющийся
Главная ф-ия вот эта, на сколько я понимаю. Только мой мозг отказывается разбираться сейчас  Смеющийся
Код:
int qAllocMore(int alloc, int extra)
{
    Q_ASSERT(alloc >= 0 && extra >= 0);
    Q_ASSERT(alloc < (1 << 30) - extra);
 
    unsigned nalloc = alloc + extra;
 
    // Round up to next power of 2
 
    // Assuming container is growing, always overshoot
    //--nalloc;
 
    nalloc |= nalloc >> 1;
    nalloc |= nalloc >> 2;
    nalloc |= nalloc >> 4;
    nalloc |= nalloc >> 8;
    nalloc |= nalloc >> 16;
    ++nalloc;
 
    Q_ASSERT(nalloc > unsigned(alloc + extra));
 
    return nalloc - extra;
}
Записан
cdsmika
Гость
« Ответ #74 : Май 19, 2014, 22:35 »

Короче поток тут не причем
Скорее всего дело в append, как и говорили.
Код:
try
    {
        char * d = new char[1700000000];

        for (int i= 0; i < 1700000000- 1; ++i)
        {
            d[i] = 1;
        }
        delete[] d;
    }
    catch(std::bad_alloc)
    {
        qDebug() << "bad_alloc";
    }
все круто
Код:
try
    {
        QString l;

        while (l.length() < 300000000)
        {
            l.append("111111");
        }
    }
    catch(std::bad_alloc)
    {
        qDebug() << "bad_alloc";
    }
песта ((( QSqlQuery::value дает тот же результат - падает с bad_alloc

Код:
        while (l.length() < 300000000)
        {
            l.append("111111");
        }
Можно примерно подсчитать во сколько нам обойдется такой цикл:
"111111" = 12 байт
300000000 * 12 = 3600000000 байт = 3515625 кбайт = 3433,2275390625 мбайт = 3,35276126861572265625 гбайт
Если памяти будет не хватать, новую нельзя выделять

У вас оперативной памяти то хватит? Улыбающийся
хватит. дело не в этом. падает гораздо раньше. выделяет 500 метров и при выделении следующих падает
Записан
Страниц: 1 ... 3 4 [5] 6 7   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.11 секунд. Запросов: 23.