Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/12: Рейтинг темы: голосов - 12, средняя оценка - 4.50
Akylax
15 / 0 / 2
Регистрация: 27.11.2012
Сообщений: 93
1

Обработка большого массива данных на C++

10.11.2014, 11:18. Просмотров 2455. Ответов 36
Метки нет (Все метки)

Суть проблемы. На работе, дали задание проработать 1 большой файл (вывести графики результата анализа и т.д.).
Файл: двоичный. ~ 71 Мб
ОЗУ: 512 Мб
В итоге там получается работа с массивом структуры с over 1 млн. элементов в нем. Естественное, стандартная обработка всего массива, в виде пробега в цикле выполняется "нууу очень" долго.

Я хотел бы узнать/спросить о различного рода существующих библиотеках, алгоритмах обработки больших данных в c++ и т.п.
Прошу поделиться соображениями,ссылками, названиями и т.п.

Буду весьма признателен.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2014, 11:18
Ответы с готовыми решениями:

Обработка большого массива
Добрый день! Есть большой массив данных в текстовом файле, слова в строчке разделены пробелом,...

Тип данных для очень большого массива
Есть массив где больше четырех миллионов элементов int massiv={0}; когда так пишу программа...

Обработка данных в виде массива структур средствами языка С++
Нужно определить минимальный год издания. Как это сделать? В читаемом файле вот это: Голдинг ...

Обработка большого объема данных
Добрый ночи ребята помогите с одной проблемой. У на старом сайте одного проекта есть база в...

Обработка большого объёма данных (10гб)
Добрый день. Прошу прощения, если пишу не туда или не нашёл ответа через поиск. Суть вопроса....

36
nmcf
6530 / 5754 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
10.11.2014, 11:20 2
Какие библиотеки ты хочешь, если памяти мало? Обрабатывай по частям. Сколько в байтах этот массив "over 1 млн. элементов"?
0
-THE_MASTER666-
Заблокирован
10.11.2014, 11:29 3
TBB -> parallel_for

Добавлено через 1 минуту
Цитата Сообщение от nmcf Посмотреть сообщение
Сколько в байтах этот массив "over 1 млн. элементов"?
не больше, чем в
Цитата Сообщение от Akylax Посмотреть сообщение
двоичный. ~ 71 Мб
Добавлено через 1 минуту
Если предполагается обработка данных на компе с современной видео картой или же профессиональными вычислительными устройствами на GPU, тогда твой вариант - CUDA

Добавлено через 1 минуту
Если ты имеешь ввиду, что ты читаешь по одному элементу с харда и что - то там делаешь на каждой итерации, то это в корне не правильно. Загружай в память сразу максимально возможный блок, выполняй с ним параллельную обработку данных, далее загружай в память опять же одной транзакцией чтения с харда следующий блок
0
Akylax
15 / 0 / 2
Регистрация: 27.11.2012
Сообщений: 93
10.11.2014, 11:54  [ТС] 4
Цитата Сообщение от nmcf Посмотреть сообщение
Обрабатывай по частям.
Не совсем понял, всмысле по частям? Распараллелить с помощью threads?
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
TBB -> parallel_for
Это что?
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
с современной видео картой
Да куда там с современной, интегрированная старенькая NVIDIA GeForce2 MX 100/200 .

Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
что ты читаешь по одному элементу с харда и что - то там делаешь на каждой итерации, то это в корне не правильно. Загружай в память сразу максимально возможный блок, выполняй с ним параллельную обработку данных
Ну я через input-поток весь файл загружаю в массив структуры. "Подвисания" конкретно начинаются при обработке, а не при загрузке в ОП.

По одному элементу это в смысле? :открыл->считал элемент->закрыл ???

Желательно по подробней о последнем.
0
10.11.2014, 11:54
-THE_MASTER666-
Заблокирован
10.11.2014, 12:15 5
Цитата Сообщение от Akylax Посмотреть сообщение
Подвисания" конкретно начинаются при обработке, а не при загрузке в ОП.
Значит памяти хватает. (ОЗУ)
Цитата Сообщение от Akylax Посмотреть сообщение
По одному элементу это в смысле? :открыл->считал элемент->закрыл ???
закрывать не обязательно, для кривого и тормозящего кода достаточно каждый элемент читать отдельным вызовом std::fstream->read Ну раз загрузка не тормозит, тогда:
Цитата Сообщение от Akylax Посмотреть сообщение
Сообщение от -THE_MASTER666-
TBB -> parallel_for
Это что?
Это библиотека, позволяющая удобно распараллеливать вычисления на все ядра процессора (ну или не на все) (Intel Threading Building Blocks) - https://ru.wikipedia.org/wiki/Intel_Threading_Building_Blocks
Есть и другие...
Цитата Сообщение от Akylax Посмотреть сообщение
NVIDIA GeForce2 MX 100/200 .
Плохо, т.к. параллельные вычисления гораздо лучше хреначить на GPGPU.

Но имей ввиду, что далеко не все алгоритмы параллелятся, всё уже зависит от тебя. А может у тебя просто сам алгоритм галимый.
0
nmcf
6530 / 5754 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
10.11.2014, 12:49 6
Я понял, что ему не хватает памяти.
может у тебя просто сам алгоритм галимый
Очень может быть.
0
MickeyBlueEyes
Студент
120 / 131 / 39
Регистрация: 07.04.2011
Сообщений: 503
10.11.2014, 13:00 7
Если ничего о данных не известно, где, что и как храниться.
То этого:
Цитата Сообщение от Akylax Посмотреть сообщение
"нууу очень" долго.
не избежать.
Цитата Сообщение от Akylax Посмотреть сообщение
ОЗУ: 512 Мб
Да памяти хоть конём ходи для вашего решения.

Полюбас один раз надо линейно пройтись, узнать где-что и как, розставить метки, потом дальше анализировать.
Мы же не знаем что за данные и какие структуры там и по каким критериям вам нужно их анализировать.
0
Akylax
15 / 0 / 2
Регистрация: 27.11.2012
Сообщений: 93
10.11.2014, 17:59  [ТС] 8
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Это библиотека, позволяющая удобно распараллеливать вычисления на все ядра процессора
На все ядра процессора, какие ядра Господь с вами там цп Intel Celeron-S, 1300 MHz
Цитата Сообщение от MickeyBlueEyes Посмотреть сообщение
Да памяти хоть конём ходи для вашего решения.
Куда ходить то?)
Цитата Сообщение от MickeyBlueEyes Посмотреть сообщение
розставить метки, потом дальше анализировать.
В смысле расставить метки? где в массиве структуры? я что-то вас не понял, можете пояснить пожалуйста?
0
-THE_MASTER666-
Заблокирован
10.11.2014, 18:14 9
Цитата Сообщение от Akylax Посмотреть сообщение
там цп Intel Celeron-S, 1300 MHz
Там наверное ещё и QNX стоит?
Цитата Сообщение от Akylax Посмотреть сообщение
какие ядра Господь с вами
Ну раз одно ядро, значит увеличить скорость можно только оптимизацией алгоритма.
Показывай свой цикл, посоветуем что - нибуть...
Хотя ты можешь сам в VisualStudio попрофилировать (если конечно у тебя действительно не QNX и не пингвинОС )
0
Akylax
15 / 0 / 2
Регистрация: 27.11.2012
Сообщений: 93
10.11.2014, 18:23  [ТС] 10
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
у тебя действительно не QNX и не пингвинОС
Да нет, хрюша 3-я. А чем вас линукс не устраивает?
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Показывай свой цикл, посоветуем что - нибуть...
Там цикл банальный, есть данные в массиве структуры, складываю/отнимаю; умножаю/делю. Все это в for(int i = 0; i< размер массива; ++i);
Насчет оптимизации.. даже не знаю. Там получается возрастает размер занимаемой памяти в 2 раза. Первый раз, при считывании данных из файла в дин. массив. Второй раз результаты вычислений в другой дин. массив такой же размерности. Вот только проблема в том, что считает долго. Я конечно же понимаю, что другого результата и ждать и не стоило, но все же надеялся найти в инете седня пару идей..
0
-THE_MASTER666-
Заблокирован
10.11.2014, 18:35 11
Цитата Сообщение от Akylax Посмотреть сообщение
А чем вас линукс не устраивает?
Не люблю не профессиональное ПО. Windows на данный момент - та ОС, чёткость работы API которого отточена многими миллиардами долларов, вложенных в ёё разработку, чего не скажешь о других ОС.

Добавлено через 49 секунд
Цитата Сообщение от Akylax Посмотреть сообщение
Там цикл банальный
Весь код по загрузке и алгоритму в студию! Только тогда сможем помочь, ванговать - не благодарное дело
0
Akylax
15 / 0 / 2
Регистрация: 27.11.2012
Сообщений: 93
10.11.2014, 18:58  [ТС] 12
handle_structure.h
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream.h>
#include <windows.h> //для ф-и memeset()
#include <stdlib.h> // Для ф-и system("") 
#include <fstream.h> // Для работы с файловыми потоками
#include <string.h> //Для работы со строками
#include <sstream.h>
using namespace std;
struct handle_pulse{
    short type; 
    float a;    
    float b;    
    float p;    
    float f;    
    double t;   
    float tau;  
    int n;      
    int nc;     
};

Unit1.cpp -- Открытие и чтение файла
Кликните здесь для просмотра всего текста

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
void __fastcall TForm1::Open1Click(TObject *Sender)
{
int i;
AnsiString convert_str;
char *filename_c;
handle_pulse buf_struct;
 if(OpenDialog1->Execute())
 {
        //Получение пути к файлу
        convert_str = OpenDialog1->FileName;
        //Преобразование типа AnsiString в char*
        filename_c = convert_str.c_str();
        //Открытие бинарника
        ifstream iin_file(filename_c, ios::in|ios::binary);
        if(!iin_file) {ShowMessage("iin_file: Can't open file!");}
        i = 0;
        //Читать до конца файла  - получить количество элементов в выборке
        while(!iin_file.eof())
        {
        iin_file.read((char*)&buf_struct.type,sizeof buf_struct.type);
        iin_file.read((char*)&buf_struct.a,sizeof buf_struct.a);
        iin_file.read((char*)&buf_struct.b,sizeof buf_struct.b);
        iin_file.read((char*)&buf_struct.p,sizeof buf_struct.p);
        iin_file.read((char*)&buf_struct.f,sizeof buf_struct.f);
        iin_file.read((char*)&buf_struct.t,sizeof buf_struct.t);
        iin_file.read((char*)&buf_struct.tau,sizeof buf_struct.tau);
        iin_file.read((char*)&buf_struct.n,sizeof buf_struct.n);
        iin_file.read((char*)&buf_struct.nc,sizeof buf_struct.nc);
        i++;
        //Очистка массива
        memset(&buf_struct,0,sizeof(buf_struct));
        }
        max_i = i;
        Form1->Caption = "Построение кривой мощности.  "+("Количество импульсов: "+String(max_i-1));
        //Закрыть входной-файловый поток
        iin_file.close();
        //Открытие бинарника
        ifstream in_file(filename_c, ios::in|ios::binary);
        if(!in_file) {ShowMessage("in_file: Can't open file!");}
        i = 0;
        //Обь явление динамического массива размером max_i-1
        struct1 = new handle_pulse[max_i-1];
        //Считать в структуру - до конца файла
        while(!in_file.eof())
        {
                in_file.read((char*)&struct1[i].type,sizeof struct1[i].type);
        in_file.read((char*)&struct1[i].a,sizeof struct1[i].a);
        in_file.read((char*)&struct1[i].b,sizeof struct1[i].b);
        in_file.read((char*)&struct1[i].p,sizeof struct1[i].p);
        in_file.read((char*)&struct1[i].f,sizeof struct1[i].f);
        in_file.read((char*)&struct1[i].t,sizeof struct1[i].t);
        in_file.read((char*)&struct1[i].tau,sizeof struct1[i].tau);
        in_file.read((char*)&struct1[i].n,sizeof struct1[i].n);
        in_file.read((char*)&struct1[i].nc,sizeof struct1[i].nc);
                //Поиск наивысшего номера РИЦ
                if(max_nc <= struct1[i].nc) {max_nc = struct1[i].nc;}
                i++;
        }
        //Закрыть входной-файловый поток
        in_file.close();
 Button1->Enabled = true;
 Button1->SetFocus();
 }
 else {ShowMessage("Can't open file!");}
 
}

-- Вычисления(обработка)
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
...
 for(j = 0; j< max_i-1; j++)
 {
    if(old_nc!=struct2[j].nc) {
    old_nc=struct2[j].nc; i++;
    str_print+=String(old_nc) + ", ";
    }
    x[j+1] = x[j]+struct2[j].tau;
    y[j] = find_max_power(&struct2[0],struct2[j].nc)*sin((PI/T[struct2[j].nc])*(x[j]));
 }
 ShowMessage("Расчет закончен!");
...
0
-THE_MASTER666-
Заблокирован
10.11.2014, 19:07 13
Какой кошмар
Не знаю, что там за вычисления, но загрузка точно ужасная...
Чей этот бинарный файл? Кто в него сохраняет? Ты или он уже такой откуда - то приходит?
0
Kastaneda
Jesus loves me
Эксперт С++
5042 / 3060 / 351
Регистрация: 12.12.2009
Сообщений: 7,740
Записей в блоге: 2
Завершенные тесты: 1
10.11.2014, 19:07 14
Зачастую предложенные выше оптимизации не требуются. Можно нехило на уровне С++ оптимизировать. Я так понимаю у тебя все цикле делается, попробуй внтренности этого цикла как-то оптимизировать.

upd
не заметил, что код уже выложен выше, пока некогда посмотреть
0
Akylax
15 / 0 / 2
Регистрация: 27.11.2012
Сообщений: 93
10.11.2014, 19:23  [ТС] 15
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Чей этот бинарный файл? Кто в него сохраняет? Ты или он уже такой откуда - то приходит?
Разве это имеет значение? нет мне его дали уже готовый.
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
но загрузка точно ужасная...
Я про это и говорю) У вас какие-нибудь мысли на этот счет?
0
Nick Alte
Эксперт С++
1653 / 1025 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
10.11.2014, 19:26 16
Цитата Сообщение от Akylax Посмотреть сообщение
C++
1
str_print+=String(old_nc) + ", ";
У меня сильное подозрение, что узкое место здесь.
0
Akylax
15 / 0 / 2
Регистрация: 27.11.2012
Сообщений: 93
10.11.2014, 19:34  [ТС] 17
Цитата Сообщение от Nick Alte Посмотреть сообщение
что узкое место здесь.
Т.е.?
0
Nick Alte
Эксперт С++
1653 / 1025 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
10.11.2014, 19:38 18
То есть, если только String не какой-то мегаоптимизированный накапливающий строковый буфер, здесь практически на каждом шаге происходит два перевыделения и копирования всей строки, в которую накапливаются все выводимые числа. Советую сравнить скорость работы с этой строчкой и без неё.
0
-THE_MASTER666-
Заблокирован
10.11.2014, 19:59 19
Цитата Сообщение от Akylax Посмотреть сообщение
Я про это и говорю) У вас какие-нибудь мысли на этот счет?
Конечно есть. Нормальные люди сохраняют в бинарник (в простейшем случае) примерно в следующем формате:
[Кол-во блоков в файле]
[БЛОК1]
[БЛОК2]
...
[БЛОКn]
чтоб не перебирать весь файл в поиске его конца для определения кол-ва блоков, это раз

Цитата Сообщение от Akylax Посмотреть сообщение
//Читать до конца файла *- получить количество элементов в выборке
* * * * while(!iin_file.eof())
* * * * {
* * * * iin_file.read((char*)&buf_struct.type,sizeof buf_struct.type);
* * * * iin_file.read((char*)&buf_struct.a,sizeof buf_struct.a);
* * * * iin_file.read((char*)&buf_struct.b,sizeof buf_struct.b);
* * * * iin_file.read((char*)&buf_struct.p,sizeof buf_struct.p);
* * * * iin_file.read((char*)&buf_struct.f,sizeof buf_struct.f);
* * * * iin_file.read((char*)&buf_struct.t,sizeof buf_struct.t);
* * * * iin_file.read((char*)&buf_struct.tau,sizeof buf_struct.tau);
* * * * iin_file.read((char*)&buf_struct.n,sizeof buf_struct.n);
* * * * iin_file.read((char*)&buf_struct.nc,sizeof buf_struct.nc);
* * * * i++;
* * * * //Очистка массива
* * * * memset(&buf_struct,0,sizeof(buf_struct));
* * * * }
Это вообще редкостная ахинея Если уж ты хочешь читать структуру из файла для поиска его конца, ну уж так вот бы сделал:
C++
1
2
3
4
5
6
    while (!iin_file.eof())
    {
        handle_pulse hp;
        iin_file.read((char*)&hp.type, sizeof(handle_pulse));
        i++;
    }
тут есть нюанс с последним блоком файле...не знаю, догадаешься аль нет
уже этот участок кода будет раз 5..6 быстрее работать, это два

где читаешь полезную информацию уже в массив - по аналогии сделай одной транзакцией чтения, это три

Добавлено через 5 минут
Цитата Сообщение от Akylax Посмотреть сообщение
Разве это имеет значение?
Конечно имеет, т.к. если ты можешь повлиять на механизм его сохранения, то ты можешь ускорить и его загрузку
0
Akylax
15 / 0 / 2
Регистрация: 27.11.2012
Сообщений: 93
11.11.2014, 00:25  [ТС] 20
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
iin_file.read((char*)&hp.type, sizeof(handle_pulse));
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
уже этот участок кода будет раз 5..6 быстрее работать, это два
Вообще-то не будет. Загрузка будет чуть быстрее, но это не решит проблемы, поставленной изначально
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Это вообще редкостная ахинея
Бывает и похуже.
0
11.11.2014, 00:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2014, 00:25

Обработка большого объема данных (теги сайта)
Есть сайт, у него таблица tags 207,168 штук MyISAM utf8_general_ci 16 МБ весом =) ...

Импорт большого количества данных, сортировка и обработка
Доброе время суток! Когда-то писал на Паскале, знал его, сейчас придётся писать программу на...

Многопоточная обработка большого массива через ThreadPool с возможностью остановки
Добрый день! Возникла такая задача. В массиве 200 тыс. строк. Их нужно обработать с помощью...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru