Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.11.2011, 02:26   #1
Anton_uz
Пользователь
 
Регистрация: 02.12.2009
Сообщений: 10
Злость максимальная скорость работы с большими массивами на C++ 6.0

Требуется помощь специалиста в области Microsoft Visual C++ 6.0

Привет.

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

Дело в том, что мой тестер будет использовать файлы исторических данных, которые планируется подгружать с жесткого диска и помещать их в массив. Но есть одна проблема – это объём подгружаемых данных – понадобится 7 300 000 индексов для 3-х массивов, а у меня всего 1 Гб оперативной памяти. Я попробовал определить массив из 1 000 000 элементов и получил ошибку компилятора

В общем, я прошу совета, что можно сделать ?
Или как можно выделить максимум памяти для работы моего тестера ?
А также прошу проинформировать меня о следующем:
- как лучше использовать память для трех типов массивов, учитывая, что нужна прежде всего максимальная скорость вычислений:
- массивы следующих типов: 2 массива типа Double с 5 знаками после запятой и 1 массив типа DateTime – это 4-х байтовое целое.

Мне нужно, чтобы данные из файлов-источников подгружались в массив по мере их надобности и максимально быстро использовались в тестере методом последовательного извлечения значений из трёх массивов и последующей обработки этих значений

Посоветуйте плз максимально быстрый способ
Anton_uz вне форума Ответить с цитированием
Старый 09.11.2011, 03:00   #2
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Для начала разберемся. У вас как вы сами сказали, 8*7.3 млн *2 + 4*7.3 млн / (1024*1024) = 139 мбайт. Так что памяти вам должно хватить. Компилятор ругается( а ругается ли или просто виснет?) потому, что вы собираетесь статически залинковать переменных на 139 мбайт, естественно это ему не нравится, напоминаю при таком вариант компилятор сделает в exe-файле пустое пространство объемом 139 мбайт, то есть ваш exe-файл будет занимать 139мб с чем-то мегабайт.

Правильное решение это выделить эту память динамически, например хотя бы так:
int* array = new int[7300000];

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

Не совсем понятно что конкретно вы собираетесь делать с этими числами, потому сказать что будет лучше просто не могу, но в теории эту задачу можно решить на GPU. Или хотя бы с использованием SIMD-блоков процессора, естественно на всех ядрах и параллельно.
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 09.11.2011, 23:14   #3
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

Если у вас 1гб памяти, это еще не значит, что у вас получится выделить ее под свои задачи одним куском. Система может не найти столько. Есть такая штука, как фрагментация памяти. Поэтому память лучше выделять кусками по мере необходимости. Из stl контейнеров для этого лучше всего подойдет deque. Можно написать свой класс для работы с большими массивами с внутренней структурой, как у дека, но с более оптимальной работой под вашу конкретную задачу. Но даже в этом случае рано или поздно вы упретесь в то, что памяти будет не хватать. Более надежно реализовать алгоритмы расчета с возможностью хранения промежуточных результатов и обращаться к этим результатам когда надо. + Это даст возможность распараллелить вычисления и нагрузить все ядра процессора.
На хабре недавно была статься, про то, как чувак разогнал скорость расчета каких-то там финансовых показателей в 72 раза за счет использования GPU.

Оптимизацией лучше занаться после того, как будет готов работающий вариант. Пусть медленный, но работающий. Желательно с автотестами. При таких объемах данных замучаетесь искать возможные ошибки. Далее профайлеры подскажут, где проседает производительность и уже после этого оптимизировать слабые места. Попробуйте сперва все сделать на std:eque, а дальше видно будет. std::vector использовать не стоит. Из-за перераспределения памяти по мере увеличения емкости производительность может сильно просесть.
_Ч_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скорость работы с базой данных Linel PHP 3 17.06.2011 21:50
Класс для работы с большими массивами xapiton Visual C++ 24 07.02.2011 18:18
Скорость работы различных СУБД _SERGEYX_ БД в Delphi 3 10.10.2010 11:38
Скорость работы программы Farrel Общие вопросы C/C++ 0 10.09.2010 23:25
Здравствуйте! Прошу совета по работе с большими массивами значений dgreez Microsoft Office Excel 5 16.12.2009 08:03