![]() |
|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 02.12.2009
Сообщений: 10
|
![]()
Требуется помощь специалиста в области Microsoft Visual C++ 6.0
Привет. Я пишу тестера для перебора значений, алгоритм простой: имеется 22 вложенных цикла, внутри которых происходит перебор значений и запоминается самое прибыльное. Дело в том, что мой тестер будет использовать файлы исторических данных, которые планируется подгружать с жесткого диска и помещать их в массив. Но есть одна проблема – это объём подгружаемых данных – понадобится 7 300 000 индексов для 3-х массивов, а у меня всего 1 Гб оперативной памяти. Я попробовал определить массив из 1 000 000 элементов и получил ошибку компилятора В общем, я прошу совета, что можно сделать ? Или как можно выделить максимум памяти для работы моего тестера ? А также прошу проинформировать меня о следующем: - как лучше использовать память для трех типов массивов, учитывая, что нужна прежде всего максимальная скорость вычислений: - массивы следующих типов: 2 массива типа Double с 5 знаками после запятой и 1 массив типа DateTime – это 4-х байтовое целое. Мне нужно, чтобы данные из файлов-источников подгружались в массив по мере их надобности и максимально быстро использовались в тестере методом последовательного извлечения значений из трёх массивов и последующей обработки этих значений Посоветуйте плз максимально быстрый способ |
![]() |
![]() |
![]() |
#2 |
somewhere else
Участник клуба
Регистрация: 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-блоков процессора, естественно на всех ядрах и параллельно.
"Тяжело в учении, легко в бою" - А.В. Суворов
|
![]() |
![]() |
![]() |
#3 |
Форумчанин
Регистрация: 07.01.2010
Сообщений: 141
|
![]()
Если у вас 1гб памяти, это еще не значит, что у вас получится выделить ее под свои задачи одним куском. Система может не найти столько. Есть такая штука, как фрагментация памяти. Поэтому память лучше выделять кусками по мере необходимости. Из stl контейнеров для этого лучше всего подойдет deque. Можно написать свой класс для работы с большими массивами с внутренней структурой, как у дека, но с более оптимальной работой под вашу конкретную задачу. Но даже в этом случае рано или поздно вы упретесь в то, что памяти будет не хватать. Более надежно реализовать алгоритмы расчета с возможностью хранения промежуточных результатов и обращаться к этим результатам когда надо. + Это даст возможность распараллелить вычисления и нагрузить все ядра процессора.
На хабре недавно была статься, про то, как чувак разогнал скорость расчета каких-то там финансовых показателей в 72 раза за счет использования GPU. Оптимизацией лучше занаться после того, как будет готов работающий вариант. Пусть медленный, но работающий. Желательно с автотестами. При таких объемах данных замучаетесь искать возможные ошибки. Далее профайлеры подскажут, где проседает производительность и уже после этого оптимизировать слабые места. Попробуйте сперва все сделать на std: ![]() |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Скорость работы с базой данных | 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 |