70 / 47 / 5
Регистрация: 10.01.2017
Сообщений: 1,848
1

Нормально ли, что Vector так медленно заполняется ?

09.04.2019, 12:30. Показов 1783. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте,

Подскажите пожалуйста, это нормально, что данный код выполняется 20 секунд!?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
    vector<string>Vector_1;
    vector<vector<string>>Vector_2;
 
 
    for (int i = 0; i < 1000; i++)
    {
        for (int y = 0; y < 20; y++)
        {
            Vector_1.push_back(to_string(y));
        }
 
        Vector_2.push_back(Vector_1);
    }
 
    cout << "Create" << endl;
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.04.2019, 12:30
Ответы с готовыми решениями:

Не заполняется переменная по ссылке. Что не так?
struct Point { int x; int y; }; class Points { public: Points(); private:

vector - что не так?
void delSame(vector&lt;int&gt; &amp;first, vector&lt;int&gt; &amp;second) { vector&lt;int&gt;::iterator pf, ps; ...

OpenGL что не так в коде? вроде все нормально
Собственно вот код, я сижу под убунтой 9.10 и он ругаеться пишет #include&lt;GL/glut.h&gt; int N = 3;...

Почему не заполняется массив vector?
Здравствуйте! Не могу понять, почему не заполняется массив vector.. Он в классе объявлен типа...

19
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
09.04.2019, 12:31 2
Цитата Сообщение от Optimus11 Посмотреть сообщение
Подскажите пожалуйста, это нормально, что данный код выполняется 20 секунд!?
И как вы замеряли?
0
70 / 47 / 5
Регистрация: 10.01.2017
Сообщений: 1,848
09.04.2019, 12:35  [ТС] 3
Да просто на часах, с момента запуска до вывода в консоль create. Тут же счет не на милисекунды.
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
09.04.2019, 12:37 4
Optimus11, у меня и секунды не заняло..
0
1718 / 567 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
09.04.2019, 12:40 5
Лучший ответ Сообщение было отмечено Optimus11 как решение

Решение

Optimus11, в Release запускай и смотри.
1
70 / 47 / 5
Регистрация: 10.01.2017
Сообщений: 1,848
09.04.2019, 12:42  [ТС] 6
Блин ну и прикол, выбрал release, посчиталось за секунду.
Но, почему в debug настолько дольше считается ?
0
1536 / 456 / 101
Регистрация: 17.05.2015
Сообщений: 1,424
09.04.2019, 12:46 7
Цитата Сообщение от Optimus11 Посмотреть сообщение
Да просто на часах, с момента запуска до вывода в консоль create. Тут же счет не на милисекунды.
https://rextester.com/NQBHZ57264

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <vector>
#include <string>
#include <chrono>
 
using namespace std;
 
typedef uint64_t MicroSeconds;
 
// вернет промежуток времени в микросекундах
// с момента последнего запуска этого же метода
MicroSeconds QuantMS()
{
    typedef std::chrono::microseconds 
        MSec;
    typedef std::chrono::high_resolution_clock
        Clock;
 
    static Clock::time_point last;
    
    const Clock::time_point now 
        = Clock::now();
    
    const auto result 
        = std::chrono::duration_cast<MSec>(now - last);
 
    last = now;
    
    return static_cast<MicroSeconds>(result.count());
}
 
 
int main()
{
    vector<string>Vector_1;
    vector<vector<string>>Vector_2;
 
    QuantMS();
    
    for (int i = 0; i < 1000; i++)
    {
        for (int y = 0; y < 20; y++)
            Vector_1.push_back(to_string(y));
 
        Vector_2.push_back(Vector_1);
    }
 
    const auto elapsed = QuantMS();
    const auto milli = elapsed/1000.0;
    const auto sec   = elapsed/1'000'000.0;
    cout 
        << "Create: " << milli 
        << " milliseconds (" << sec << " sec )" 
        <<  endl;
 
}
output:
Код
Create: 282.366 milliseconds (0.282366 sec )
1
70 / 47 / 5
Регистрация: 10.01.2017
Сообщений: 1,848
09.04.2019, 13:00  [ТС] 8
У меня появился немного другой вопрос, запуская в релиз, изменил только кол-во 1000 на 100 000.
На момент запуска оперативка заполнена на 2.6 Гб, запускаю, и заполнение оперативки начинает резко увеличиваться и достигает 3.8 после чего:

C++
1
процесс завершает работу с кодом- 1073740791
Неужели так оперативная память используется ?
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
09.04.2019, 13:06 9
Цитата Сообщение от Optimus11 Посмотреть сообщение
и заполнение оперативки начинает резко увеличиваться и достигает 3.8 после чего:
Фрагментация памяти. После чего не возможность выделить новый кусок памяти в куче, вот и имеем краш программы.
0
75 / 55 / 21
Регистрация: 10.07.2018
Сообщений: 214
09.04.2019, 13:07 10
Ну конечно она сильно жрется - ты используешь контейнер, который хранит какие-то свои дополнительные данные и, кроме того, еще записываешь в него 2 миллиона строк
0
6091 / 3449 / 1402
Регистрация: 07.02.2019
Сообщений: 8,768
09.04.2019, 13:11 11
хмм... у меня в дебаг режиме максимум 700мб сожрала
0
70 / 47 / 5
Регистрация: 10.01.2017
Сообщений: 1,848
09.04.2019, 13:11  [ТС] 12
Понял.
А возможноли сократить использумую память , если использоаать динамический массив за место вектора ?
0
1536 / 456 / 101
Регистрация: 17.05.2015
Сообщений: 1,424
09.04.2019, 13:11 13
Цитата Сообщение от Optimus11 Посмотреть сообщение
почему в debug настолько дольше считается ?
debug - "дебаг", или "отладочная версия" продукта.
Сборка, специально предназначенная для того,
что бы у программиста была возможность отладить программу.

Поэтому, дебажная сборка не использует оптимизацию
(это нужно, что бы можно было пошагово отлаживать программу)

Кроме того, дебажная сборка включает в себя 100500 всевозможных дополнительных проверок всего и всея.
Это нужно, что бы у программиста была возможность выявить и устранить возможные ошибки.

При релизной сборке код оптимизирован, и из него были исключены все эти 100500 проверок.
Поэтому, релизный код часто работает значительно (в несколько раз) быстрее, чем дебажный.
0
75 / 55 / 21
Регистрация: 10.07.2018
Сообщений: 214
09.04.2019, 13:15 14
Да, используемая память сократится, но не забывай про 2 миллиона строк

Добавлено через 1 минуту
Подсчитай, сколько нужно памяти для помещения такого количества строк (по 2 и 3 символа с учетом конца строки) и удивись

Добавлено через 1 минуту
А std::string не позаботится о том, чтобы они хранились настолько оптимально) Он создаст некий буфер, который будет наверняка хотя бы в пару-тройку раз длиннее (зависит от реализации). Так что, если хочешь сократить потребление памяти, используй в данном примере строки в стиле Си
0
1536 / 456 / 101
Регистрация: 17.05.2015
Сообщений: 1,424
09.04.2019, 13:45 15
Цитата Сообщение от Optimus11 Посмотреть сообщение
У меня появился немного другой вопрос, запуская в релиз, изменил только кол-во 1000 на 100 000.
На момент запуска оперативка заполнена на 2.6 Гб, запускаю, и заполнение оперативки начинает резко увеличиваться и достигает 3.8 после чего:
процесс завершает работу с кодом- 1073740791
Неужели так оперативная память используется ?
Представьте себе!
А вы осознаете, сколько на самом деле памяти вы запросили?

Рассмотрим код:


https://rextester.com/JDBWAJ26948

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <iostream>
#include <vector>
#include <string>
#include <chrono>
 
using namespace std;
 
typedef uint64_t MicroSeconds;
 
// вернет промежуток времени в микросекундах
// с момента последнего запуска этого же метода
MicroSeconds QuantMS()
{
    typedef std::chrono::microseconds 
        MSec;
    typedef std::chrono::high_resolution_clock
        Clock;
 
    static Clock::time_point last;
    
    const Clock::time_point now 
        = Clock::now();
    
    const auto result 
        = std::chrono::duration_cast<MSec>(now - last);
 
    last = now;
    
    return static_cast<MicroSeconds>(result.count());
}
 
 
int main()
{
    vector<string>Vector_1;
    vector<vector<string>>Vector_2;
 
    try
    {
        Vector_1.reserve(20'000'000);
        
    } catch(const std::exception&)
    {
        cout << "Vector_1: мне не дали память для 2'000'000 строчек\n";
    }
    
    try
    {
        Vector_2.reserve(100'000);
        
    } catch(const std::exception&)
    {
        cout << "Vector_2: мне не дали память для 100'000 массивов строк\n";
    }
    
    cout << "========" << endl;
   
    QuantMS();
    
    size_t count = 0;
                         
    try
    {
        for (int i = 0; i < 100'000; i++)
        {
            for (int y = 0; y < 20; y++)
                Vector_1.emplace_back(to_string(y));
 
            Vector_2.emplace_back(Vector_1);
            
            count += Vector_2.back().size();
            
            cout << "count = " << count << " : Vector_1 = " << Vector_1.size() << '\n';
            
        }
    }
    catch(const std::exception&)
    {
        cout << "НЕ ХВАТКА ПАМЯТИ!!!\n";
        cout << "Vector_1: " << Vector_1.size() << '\n';
        cout << "Vector_2: " << Vector_2.size() << '\n';
        cout << "count : " << count << '\n';
    }             
 
    const auto elapsed = QuantMS();
    const auto milli = elapsed/1000.0;
    const auto sec   = elapsed/1'00'000.0;
    cout 
        << "Create: " << milli 
        << " milliseconds (" << sec << " sec )" 
        <<  endl;
 
}
output:
Код
========
count = 20 : Vector_1 = 20
count = 60 : Vector_1 = 40
count = 120 : Vector_1 = 60
count = 200 : Vector_1 = 80
count = 300 : Vector_1 = 100
...
ount = 26130720 : Vector_1 = 32320
count = 26163060 : Vector_1 = 32340
count = 26195420 : Vector_1 = 32360
НЕ ХВАТКА ПАМЯТИ!!!
Vector_1: 32380
Vector_2: 1618
count : 26195420
Create: 696.356 milliseconds (6.96356 sec )
Цитата Сообщение от Optimus11 Посмотреть сообщение
А возможноли сократить использумую память , если использоаать динамический массив за место вектора ?
26'195'420 Карл!!! В 1'618 массивах.

Если вам нужно оперировать данными таких колоссальных объемов,
то "динамический массив" вас уже не спасет.

Для работы с такими объёмами человечество изобрело "базы данных"
2
70 / 47 / 5
Регистрация: 10.01.2017
Сообщений: 1,848
09.04.2019, 15:04  [ТС] 16
Попробывал вообще по минимум просто:

C++
1
2
3
4
int i = 0; i < 100000; i++)
    {
        for (int y = 0; y < 1; y++)
        {
То есть это уже просто 100 тыщ записей, в екселе открыватся больше может. Но все равно память переполняется.
В VBA массив с большим числом элементов гарантировано записывался.
0
75 / 55 / 21
Регистрация: 10.07.2018
Сообщений: 214
09.04.2019, 15:07 17
Optimus11,
Цитата Сообщение от dreamer_108 Посмотреть сообщение
А std::string не позаботится о том, чтобы они хранились настолько оптимально) Он создаст некий буфер, который будет наверняка хотя бы в пару-тройку раз длиннее (зависит от реализации). Так что, если хочешь сократить потребление памяти, используй в данном примере строки в стиле Си
Просто попробуй рази интереса сравнить сколько занимает строка в стиле Си и рядом стоящая c++ строка с таким же содержимым. Потом умножь разницу на количество создаваемых тобой объектов.

Добавлено через 27 секунд
Кроме того, когда ты записываешь созданный вектор в главный вектор, он не как ссылка туда записывается, а копируется
0
1536 / 456 / 101
Регистрация: 17.05.2015
Сообщений: 1,424
09.04.2019, 15:20 18
Цитата Сообщение от Optimus11 Посмотреть сообщение
То есть это уже просто 100 тыщ записей
Вы мне сейчас напоминаете индийского царя Шерама из старой легенды)))

сказка о царе, и его любви к шахматам
Шахматная игра была придумана в Индии, и когда индийский царь Шерам познакомился с нею, он был восхищен ее остроумием и разнообразием возможных в ней положений. Узнав, что игра изобретена одним из его подданных, царь приказал его позвать, чтобы лично наградить за удачную выдумку.

Изобретатель — его звали Сета — явился к трону повелителя. Это был скромно одетый ученый, получавший средства к жизни от своих учеников.

— Я желаю достойно вознаградить тебя, Сета, за прекрасную игру, которую ты придумал,— сказал царь.

Мудрец поклонился.

— Я достаточно богат, чтобы исполнить самое смелое твое пожелание,— продолжал царь.— Назови награду, которая тебя удовлетворит, и ты получишь ее.

Сета молчал.

— Не робей,— ободрил его царь.— Выскажи свое желание. Я не пожалею ничего, чтобы исполнить его!

— Велика доброта твоя, повелитель. Но дай срок обдумать ответ. Завтра, по зрелом размышлении, я сообщу тебе мою просьбу.

Когда на другой день Сета снова явился к ступеням трона, он удивил царя беспримерной скромностью своей просьбы.

— Повелитель,— сказал Сета,— прикажи выдать мне за первую клетку шахматной доски одно пшеничное зерно.

— Простое пшеничное зерно? — изумился царь.

— Да, повелитель. За вторую клетку прикажи выдать два зерна, за третью — четыре, за четвертую — 8, за пятую— 16, за шестую — 32…

— Довольно! — с раздражением прервал его царь.— Ты получишь свои зерна за все 64 клетки доски, согласно твоему желанию: за каждую вдвое больше против предыдущей. Но знай, что просьба твоя недостойна моей щедрости. Прося такую ничтожную награду, ты непочтительно пренебрегаешь моей милостью. Поистине, как учитель, ты мог бы показать лучший пример уважения к доброте своего государя. Ступай! Слуги мои вынесут тебе мешок с пшеницей.
...
Сказка заканчивается тем, что внезапно оказалось: ни у царя,
ни даже во всем мире не хватит столько пшеницы,
что бы выполнить просьбу скромного Сета.




Знаете сколько на самом деле записей даст алгоритм с такими циклами? )))
C++
1
2
3
4
        for (int i = 0; i < 100'000; i++)
        {
            for (int y = 0; y < 1; y++)
                Vector_1.emplace_back(to_string(y));

Код
========
НЕ ХВАТКА ПАМЯТИ!!!
Vector_1: 9549
Vector_2: 9548
count : 45586926
Create: 1137.86 milliseconds (11.3786 sec )
Программа рухнула после того, как количество записей превысило 45'586'926
45 миллионов, Карл!!!!
0
Manowar
09.04.2019, 15:51
  #19

Не по теме:

Цитата Сообщение от eva2326 Посмотреть сообщение
Сказка заканчивается тем, что внезапно оказалось: ни у царя,
ни даже во всем мире не хватит столько пшеницы,
что бы выполнить просьбу скромного Сета.
По моему ему там голову отрубили чтобы не умничал и над падишахом не издевался.

0
70 / 47 / 5
Регистрация: 10.01.2017
Сообщений: 1,848
09.04.2019, 17:58  [ТС] 20
Вот я балда!
Я почему то думал, что я пуш бэками в вектор1 всегда в нулевой элемент записываю, и еще удивляюсь, че такое че происходит
0
09.04.2019, 17:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.04.2019, 17:58
Помогаю со студенческими работами здесь

Grid заполняется данными слишком медленно
Ребят подскажите пожалуйста. Вот проект, он состоит из грида и кнопок, меня пока интересует одно,...

Отчего так бывает, что на одних ПК с запроса из БД SQL Server в Excel таблица экспортируется нормально
Отчего так бывает, что на одних ПК с запроса из БД SQL Server в Excel таблица экспортируется...

Очень медленно работает скрипт с журналом событий, это нормально?
Всем доброго! Только начал работать на PowerShell, возникла не преодолимая необходимость....

Нюансы синтаксиса: что означает запись vector<int*> a и vector <int>*a ?
Часто встречается вот такая запись: vector&lt;int&gt; a; это понятно что. Массив объектов int А вот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru