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

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

10.11.2014, 11:18. Показов 7630. Ответов 37
Метки нет (Все метки)

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

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

Буду весьма признателен.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.11.2014, 11:18
Ответы с готовыми решениями:

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

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

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

37
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
15.11.2014, 08:03
Студворк — интернет-сервис помощи студентам
А зачем нужно считывать все блоки для определения их количества? Можно же разделить размер файла на размер блока и получить max_i. Сами блоки тоже можно разом считать.
0
15 / 0 / 2
Регистрация: 27.11.2012
Сообщений: 93
16.11.2014, 09:21  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Сами блоки тоже можно разом считать.
Так я разом и считываю)
Цитата Сообщение от nmcf Посмотреть сообщение
Можно же разделить размер файла на размер блока и получить max_i.
а чтобы получить размер блока надо его считать для начала.
Мне бы как-нить памяти дополнительно выделить, а то прога выделят какое-то количество и зависает
0
Заблокирован
16.11.2014, 09:24
Цитата Сообщение от Akylax Посмотреть сообщение
Мне бы как-нить памяти дополнительно выделить, а то прога выделят какое-то количество и зависает
Чего выделить? Памяти? Ну если у тебя физический больше нет - купи ещё одну плашку с памятью - потом уж и выделяй

Добавлено через 1 минуту
Цитата Сообщение от Akylax Посмотреть сообщение
а чтобы получить размер блока надо его считать для начала.
Ну считай только первый, зачем весь файл парсить то, или у тебя все блоки разного размера ?
0
15 / 0 / 2
Регистрация: 27.11.2012
Сообщений: 93
16.11.2014, 14:00  [ТС]
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Чего выделить? Памяти? Ну если у тебя физический больше нет - купи ещё одну плашку с памятью - потом уж и выделяй
Легко сказать, невозможно сделать. Да нет хватает, прога память отказывается выделять.
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Ну считай только первый, зачем весь файл парсить то, или у тебя все блоки разного размера ?
структура одна в принципе, разве что данными различаются
0
Заблокирован
16.11.2014, 14:25
Цитата Сообщение от Akylax Посмотреть сообщение
прога память отказывается выделять
А как она тебе об этом докладывает?
Если падает просто, то ставь new в try / catch и лови исключения с вероятной последующей обработкой. Смотри, какие исключения именно кидает.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
16.11.2014, 14:29
Размер структуры фиксирован, его можно сразу рассчитать и разделить размер файла на размер структуры, sizeof даёт размер сам по себе без какого-либо чтения.
Памяти можно выделить даже больше, чем доступно, там же виртуальная память используется, что-то будет выгружено на диск. И если размер файла 70 Мб, то это не так много.
0
Заблокирован
16.11.2014, 18:21
nmcf, да ТС походу под кайфом посты лепит, какой - то не связанный бред
0
15 / 0 / 2
Регистрация: 27.11.2012
Сообщений: 93
17.11.2014, 10:30  [ТС]
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
nmcf, да ТС походу под кайфом посты лепит, какой - то не связанный бред
Однако бред..

Добавлено через 13 часов 51 минуту
Цитата Сообщение от nmcf Посмотреть сообщение
И если размер файла 70 Мб, то это не так много.
Дело в том, что это двоичный файл. В обычном представлении, допустим перегнав его в .txt размер выйдет где-то в 3-5 раз больше этого.
Загружается в память нормально(спокойно наблюдается в диспетчере как с ~4 Мб процесс забирает до 100 Мб памяти -> во время считывания двоичного файла.)
Но вот как это обрабатывать, как это запихнуть в статический элемент Chart для вывода графика, там нуу очень много точек получается.
До сих пор 0 идей. Пробовал сделать 10 нитей, распараллелить так сказать, все равно как-то виснет, да еще и проблема с синхронизацией владения компонентом между нитями(конкретно Chart).
p.s. использовал CreateThread().
0
Заблокирован
17.11.2014, 10:36
Архив проекта в студию. Так же опиши по пунктам, что на данный момент на твой взгляд в нём работает не верно и в каких аспектах сего кода ты просишь помощи.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
17.11.2014, 10:39
Цитата Сообщение от Akylax Посмотреть сообщение
Дело в том, что это двоичный файл. В обычном представлении, допустим перегнав его в .txt размер выйдет где-то в 3-5 раз больше
А зачем его преобразовывать в текстовый вид? Чтобы себе задачу усложнить?
0
Заблокирован
17.11.2014, 10:51
Цитата Сообщение от nmcf Посмотреть сообщение
А зачем его преобразовывать в текстовый вид? Чтобы себе задачу усложнить?
Лично я уже давно мысль потерял, чего ТС добивается
0
3178 / 1937 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
17.11.2014, 11:29
Забыть про потоки и динамические массивы при чтении. Ничего из этого для обработки простейшей таблицы не требуется. 70 Mb - это "ни о чем". Отобразить файл на память и обрабатывать. Sin (если промеры покажут здесь задержку) можно посчитать один раз заранее (с нужным шагом) и оформить таблицей. Результат писать в другой файл потоком.
0
15 / 0 / 2
Регистрация: 27.11.2012
Сообщений: 93
18.11.2014, 17:35  [ТС]
Цитата Сообщение от gazlan Посмотреть сообщение
Отобразить файл на память и обрабатывать
Не совсем представляю как потом через MapViewOfFile() получить адрес всей структуры и работать с ней? (могу представить получение адреса на скажем массив какой-нить там, строчку *char str и т.п.)
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
18.11.2014, 17:44
Разом загрузить содержимое в массив структур без отображаемых файлов.
0
3178 / 1937 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
18.11.2014, 18:33
Цитата Сообщение от Akylax Посмотреть сообщение
получить адрес всей структуры и работать с ней
Нет ничего проще. Адрес View - это адрес массива. Прибавляете размер вашей структуры (с учетом выравнивания), умноженный на ее индекс (zero based). Иными словами, работаете с View как с обычным массивом структур.

Вот в этой теме: "Есть очень много маленьких текстовых файлов необходимо слить в один файл" я выкладывал пример работы с MMF.

Добавлено через 6 минут
Собственно, если сделать cast к указателю на ваш тип данных, то можете обращаться к нужной структуре прямо по индексу.
0
15 / 0 / 2
Регистрация: 27.11.2012
Сообщений: 93
20.11.2014, 10:37  [ТС]
Цитата Сообщение от gazlan Посмотреть сообщение
Нет ничего проще.
Собственно не получилось. Преобразовал View в тип структуры, получил доступ. Но считывание полей структуры из файла некорректно происходит. Где-то правильно считывает, где-то вместо числа выводит рандом либо максимальное число в диапазоне типа.
Например:
Кликните здесь для просмотра всего текста

Code
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
value of pointer = 16384000
index = 1
type = 1 //верно
a = 7.32592e+13 //неверно
b = -1.24722e+06//неверно
p = -1.09059e-19//неверно
f = 5.80425e-11//неверно
t = 1.74173e-309//неверно
tau = 0//неверно
n = 65536//неверно
nc = 1106611070//неверно
_____________________________________________________________
value of pointer = 16384048
index = 2
type = 18968//неверно
a = 9000//верно, но значение должно быть в другом поле
b = -1.25091e-29 //неверно
p = 0.773132//верно
f = 5//значение должно быть в поле tau
t = -5.11488e-253 //неверно
tau = 7.38089e+13 //неверно
n = -887603257 //неверно
nc = -1610563309//неверно
_____________________________________________________________
value of pointer = 16384096
index = 3
type = -4895 //неверно
a = 2.27024e-41//неверно
b = 2.9869e-40//неверно
p = 0//неверно
f = 9.18355e-41//неверно
t = -240020//неверно
tau = 9000 //верно, но значение должно быть в поле f
n = 1246021552//неверно
nc = 1061976499//неверно

Ну вот как-то так.
Код следующий:
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
HANDLE fhandle;
 handle_pulse * pView;
 HANDLE   hMap;
...
fhandle=CreateFile(filename_c,GENERIC_READ,0,0,OPEN_EXISTING,1,0);
   if(fhandle==INVALID_HANDLE_VALUE) {ShowMessage("Cannot open file REASON: "+GetLastError()); Form1->Close();}
   //mapping
   hMap = CreateFileMapping(fhandle,0,PAGE_READONLY,0,0,0);
   if (!hMap)
   {
      // Error !
     ShowMessage("Cannot mapping file REASON: "+GetLastError());
      Form1->Close();
   }
   //Create View
   pView = (handle_pulse *)MapViewOfFile(hMap,FILE_MAP_READ,0,0,0);
   if (!pView)
   {
      //Error!
      ShowMessage("Cannot create view REASON: "+GetLastError());
      Form1->Close();
   }
 
for(int j = 1; j <= 63; j++)
   {
     out<<"value of pointer = "<<pView<<endl;
     out<<"index = "<<j<<endl;
     out<<"type = "<<pView->type<<endl;
     out<<"a = "<<pView->a<<endl;
     out<<"b = "<<pView->b<<endl;
     out<<"p = "<<pView->p<<endl;
     out<<"f = "<<pView->f<<endl;
     out<<"t = "<<pView->t<<endl;
     out<<"tau = "<<pView->tau<<endl;
     out<<"n = "<<pView->n<<endl;
     out<<"nc = "<<pView->nc<<endl;
     pView  = pView + 1; //+48
     out<<"_____________________________________________________________"<<endl;
     i++;
   }
UnmapViewOfFile(pView);
   CloseHandle(hMap);
   CloseHandle(fhandle);
0
3178 / 1937 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
20.11.2014, 13:11
1. На pView надо сделать приведение к нужному типу (сейчас это void*)
2. Структура должна иметь корректное выравнивание (либо в опциях компилятора, либо #pragma)

Типа этого:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#pragma pack(push,1)
struct FILE_RECORD
{
   char     _cChr;
   int      _iInt;
   float    _fDbl;
};
#pragma pack(pop)
 
FILE_RECORD*   pRecord = (FILE_RECORD*)pView;
 
for (int ii = 0; ii < 10; ++ii)
{
   printf("%c  %d  %f\n",pRecord[ii]._cChr,pRecord[ii]._iInt,pRecord[ii]._fDbl);
}
Добавлено через 26 минут
+ еще пример работы с MMF - чтение заголовка PE-файла (все структуры из <WINNT.H>):

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
bool PELib::Open(const BYTE* const pMMF)
{
   _bValid = false;
 
   if (!pMMF)
   {
      return false;
   }
 
   _pMMF = (BYTE*)pMMF;
 
   _pDosHeader = (PIMAGE_DOS_HEADER)_pMMF;
 
   if (_pDosHeader->e_magic != IMAGE_DOS_SIGNATURE)
   {
      return false;
   }
         
   _pNTHeader = MakePtr(PIMAGE_NT_HEADERS,_pDosHeader,_pDosHeader->e_lfanew);
 
   // First, verify that the e_lfanew field gave us a reasonable pointer, then verify the PE signature.
   if (IsBadReadPtr(_pNTHeader,sizeof(IMAGE_NT_HEADERS)) || _pNTHeader->Signature != IMAGE_NT_SIGNATURE)
   {
      return false;
   }
 
   // [url]http://msdn.microsoft.com/en-us/library/ms680313%28v=vs.85%29.aspx[/url]
   if ((_pNTHeader->FileHeader.Machine != IMAGE_FILE_MACHINE_I386)   &&    // 0x014C   // x86
       (_pNTHeader->FileHeader.Machine != IMAGE_FILE_MACHINE_IA64)   &&    // 0x0200   // Intel Itanium
       (_pNTHeader->FileHeader.Machine != IMAGE_FILE_MACHINE_AMD64))       // 0x8664   // x64
   {
      return false;
   }
 
   // [url]http://msdn.microsoft.com/en-us/library/ms680339%28v=vs.85%29.aspx[/url]
   if ((_pNTHeader->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC) &&    // 0x010B   // The file is an executable image.
       (_pNTHeader->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR64_MAGIC) &&    // 0x020B   // The file is an executable image.
       (_pNTHeader->OptionalHeader.Magic != IMAGE_ROM_OPTIONAL_HDR_MAGIC))       // 0x0107   // The file is a ROM image.
   {
      return false;
   }
 
   _bValid = true;
 
   _bPE64 = (_pNTHeader->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC);
 
    return true;
}
0
0 / 0 / 0
Регистрация: 31.03.2020
Сообщений: 3
28.02.2022, 12:22
используйте Blockread или файлы отображаемые в память
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.02.2022, 12:22

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru