Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
27 / 27 / 9
Регистрация: 21.04.2015
Сообщений: 704

Работа с большими объёмами данных

12.12.2019, 16:55. Показов 1384. Ответов 6
Метки нет (Все метки)

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

На данный момент у меня имеется функция, которая всё это перечитывает по абзацам, делает некоторые операции над словами и выдаёт результат обработки абзаца, отсортированный по возрастанию. Думаю это скидывать во временный файл, содержащий весь объём данных (цикл дозаписи в файл), вопрос в том, как потом это отсортировывать, какими средствами?

Что делать, если даже объём отдельных файлов слишком большой, чтобы его неглядя пихать в оперативу? Не говоря уже о общем объёме. Вменяемые текстовые редакторы с такими файлами работают кусками, запрашивая у юзверя диапазон байт с которыми он хочет работать, но при необходимости они умеют сортировать содержимое таких файлов.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.12.2019, 16:55
Ответы с готовыми решениями:

Работа с большими объемами данных
С вебсервиса скачиваеться JSON с 16ю МБ данными. Далее ее в StringBuilder, но программа валиться с ошибкой OutOfMemory (Ну в принципе...

Выполнение логических операций с большими объемами данных.
Ситуация следующая: Имеется два массива байтов, порядка трех мегабайтов (!) каждый. Нужно в третий массив такой же длины поместить...

Разработка приложений, ориентированных на работу с большими объемами данных
Всем доброго времени суток! На днях столкнулся с весьма тривиальной, но, как оказалось, достаточно сложной проблемой. Все дело в выборе...

6
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
12.12.2019, 21:09
Цитата Сообщение от Ваю Посмотреть сообщение
вопрос в том, как потом это отсортировывать, какими средствами?
Merge Sort спасет отца русской демократии.
0
27 / 27 / 9
Регистрация: 21.04.2015
Сообщений: 704
13.12.2019, 00:53  [ТС]
Об этом я уже и сам догадался, но я не вижу функцию, которая покажет мне максимальный непрерывный кусок оперативы для реализации подобного сортирования сортирования сортированием, дабы убить на это меньше времени шкрябания головками по блинам.

В комментах к заголовку sysinfoapi написано, что это мол только L1, значит есть и L2+? В нём нашёл только самую общую инфу и никаких деталей. Только сколько оперативы воткнуто, сколько используется и сколько ещё доступно, аналогичная фигня по файлу подкачки и виртуальной памяти.

Добавлено через 3 часа 24 минуты
Пока нашёл вот это:

Фиксирование страниц виртуальной памяти

Выделяемая область памяти будет гарантированно размещаться в физической оперативной памяти. Данное адресное пространство не хранит пустые страницы в физической памяти, поэтому занимает только востребованный объём памяти. Именно поэтому даже на 64-битных системах возможно одновременно запускать несколько процессов, и не бояться того, что объем физической памяти сильно меньше 2^64 B.

C++
1
2
3
4
5
6
7
8
9
10
11
#include <memoryapi.h>
 
BOOL VirtualLock(
    LPVOID lpvAddress,  // адрес начала фиксируемой области памяти
    DWORD cbSize    // размер области в байтах
);
 
BOOL VirtualUnlock(
    LPVOID lpvAddress,  // адрес начала расфиксируемой области памяти
    DWORD cbSize    // размер области в байтах
);
По умолчанию приложение может зафиксировать не более 30 страниц виртуальной памяти (до 120Кб). И это сделано не зря - фиксирование большого количества страниц одним приложением уменьшает объем физической памяти, доступной для других приложений и может отрицательно сказаться на производительности всей системы в целом. Однако при необходимости вы можете увеличить это значение при помощи функции "SetProcessWorkingSetSize", описанной в SDK.

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

Рабочий комплект памяти процесса - набор страниц памяти, в настоящее время видимых процессом в физической оперативной памяти (RAM). Эти страницы являются резидентными и доступны для приложения, чтобы использоваться не вызвав ошибки из-за отсутствия страницы. Минимальный и максимальный размер рабочего комплекта памяти воздействуют на характер работы страничной организации виртуальной памяти процесса.

Рабочий комплект памяти заданного процесса может быть освобождён при помощи установки значения – (минус) 1, и для минимального и для максимального размера рабочего комплекта.

Если значения или dwMinimumWorkingSetSize, или dwMaximumWorkingSetSize больше, чем текущий размер рабочего комплекта памяти процессов, заданный процесс должен иметь привилегию SE_INC_BASE_PRIORITY_NAME. Пользователи в группе "Администраторы" и группе "Опытные пользователи", имеют эту привилегию.

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

Использование функции SetProcessWorkingSetSize для установки минимального и максимального размера рабочего комплекта памяти прикладной программы не гарантирует того, что требуемая память будет зарезервирована, или что она останется всегда резидентной. Когда приложение бездействует, или ситуация с нехваткой памяти вызывает запрос на память, операционная система может уменьшить рабочий комплект памяти приложения. Прикладная программа может использовать функцию VirtualLock, чтобы заблокировать область виртуального адресного пространства приложения в памяти; однако, это может потенциально ухудшить эффективность системы.

Когда Вы увеличиваете размер рабочего комплекта памяти прикладной программы, Вы забираете физическую память у остальной части системы. Это может ухудшить эффективность других приложений и системы в целом. Это может также привести к сбоям операций, которые требуют, чтобы присутствовала физическая память; например, создавая процессы, потоки и пул (динамически распределяемую область) ядра. Таким образом, Вы должны использовать функцию SetProcessWorkingSetSize с большой осторожностью. Вы должны всегда рассматривать эффективность системы в целом, когда разрабатываете прикладную программу.

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
//Листинг 21.7.Чтение и изменение рабочего множества виртуальных страниц процесса
 
#include <windows.h>
#include <iostream>
 
int main() {
    const int size = 4096;  // размер страницы
    SIZE_T min, max; // мин. и макс, размеры рабочего множества страниц
    SIZE_T *pMin = &min;    // указатель на минимальный резидентный размер, когда процесс активен
    SIZE_T *pMax = &max;    // указатель на максимальный резидентный размер, когда процесс активен
    HANDLE hProcess = GetCurrentProcess();  // получить дескриптор текущего процесса
 
    if (!GetProcessWorkingSetSize(  // прочитать границы рабочего множества
        hProcess,   // дескриптор процесса
        pMin,   // минимальный размер рабочего комплекта в байтах
        pMax    // максимальный размер рабочего комплекта в байтах
    )) {
        std::cout << "Get process working set size failed." << std::endl;
        return GetLastError();
    }
    else {
        std::cout << "Min = " << (min / size) << std::endl;
        std::cout << "Max = " << (max / size) << std::endl;
    }
 
    if (!SetProcessWorkingSetSize(  // установить новые границы рабочего множества
        hProcess,   // дескриптор процесса
        min - 10,   // минимальный размер рабочего комплекта в байтах
        max - 10    // максимальный размер рабочего комплекта в байтах
    )) {
        std::cout << "Set process working set size failed." << std::endl;
        return GetLastError();
    }
 
    if (!GetProcessWorkingSetSize(hProcess, pMin, pMax)) {  // прочитать новые границы рабочего множества
        std::cout << "Get process working set size failed." << std::endl;
        return GetLastError();
    }
    else {
        std::cout << "Min = " << (min / size) << std::endl;
        std::cout << "Max = " << (max / size) << std::endl;
    }
 
    return EXIT_SUCCESS;
}
Я так понимаю оно просто изменяет порог того, когда занимаемый в физической памяти объём данных нужно начинать выпихивать из оперативы в файл подкачки. Судя по написанному метод не даёт никаких гарантий того, что будет использоваться только оператива, но всё будет по возможности стремиться к этому. Несколько напрягает, что ни функция блокировки, ни функция изменения числа страниц не показывают доступный на данный момент безопасный объём памяти для работы, разве что понятно, что они обе имеют доступ к переменной, хранящей подобное по смыслу значение, которым управляет винда. Оно-то и понятно, что отбирать ими оперативу в таких количествах с их помощью изначально не планировалось, но хотелось бы знать что происходит и не пора ли начинать высвобождать оперативу в случае чего.

Кто-нить скажет насколько это стрёмно? Это не совсем то, что я хотел. Насколько я понимаю данный метод чуть ли не наглухо забирает оперативу у системы и если др процессам в это время не хватит памяти - может вскочить вавка. %) Можно ли этим забрать скажем 90% свободной физической оперативы? И что может случиться при самом хреновом раскладе в этом случае?
0
27 / 27 / 9
Регистрация: 21.04.2015
Сообщений: 704
13.12.2019, 18:13  [ТС]
Кто-нить может чё-нить сказать по поводу всего этого?

Если вычитать не какие-то там 10 байт, как в примере, а все 4096, то - число страниц на выходе остаётся то же, что и при вычитании 10, получается оно нифига не увеличивает в большую сторону объём памяти, как написано, чтоб всё влезло, а тупо урезает значение до целых страниц. Получается можно недополучить до 4095 байт при выделении если не пересчитывать значение нужной памяти перед запросом. Или я чего-то не понимаю?

Добавлено через 14 минут
Вин10 х64
min - 1
max + 4095

Min = 204800 (50)
Max = 1413120 (345)
Min = 200704 (49)
Max = 1413120 (345)
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
13.12.2019, 20:06
Цитата Сообщение от Ваю Посмотреть сообщение
сортировку результирующих слов
Если я правильно понял, есть набор файлов из кучи слов и нужно составить список слов в алфавитном порядке.

Если позволяет место, можно пойти по файлам и составлять B-Tree в отдельных файлах.

Результирующий B-Tree можно развернуть в отсортированный список.
1
27 / 27 / 9
Регистрация: 21.04.2015
Сообщений: 704
13.12.2019, 23:03  [ТС]
lemegeton, да, грубо говоря нужно получить словарь слов, использующихся во всех этих файлах.

По поводу писанины выше. Пытаюсь получить привилегию SE_INC_BASE_PRIORITY_NAME, в коде пока запрашиваю чё попроще, не суть, но в итоге под админом получаю такую шнягу на самом выходе после отработки LsaAddAccountRights

C++
1
#define STATUS_ACCESS_DENIED    ((NTSTATUS)0xC0000022L) // -1073741790
Если это важно, то имя компа и пользователя у меня оставлены NULL, это вроде должно означать "брать текущие, где работает процесс".

Смотрел и др метод, создавать файл в оперативе, оно может даже и прокатит, хотя не писал ещё код, но с таким раскладом мне придётся сначала записать этот файл на диск, найти в нём самое длинное слово и потом выровнять все слова по его длине, после чего уже сортировать, не слишком-то такой метод радует.
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
16.12.2019, 00:56
Предлагаю предподготовку перед сортировкой.
Берем файлы на вход и читаем их построчно. На выходе файлы, в которых слова сгруппированы по первой букве.
A.txt -- слова, начинающиеся с "А"
B.txt -- слова, начинающиеся с "B"
C.txt -- слова, начинающиеся с "C"
и так далее.
Потом пройтись по каждому файлу и если он слишком большой, разделить его на группы по второй букве.
BA.txt -- слова, начинающиеся с "BA"
BB.txt -- слова, начинающиеся с "BB"
и так далее.
Когда все файлы станут разумной длины, отсортировать их, сделав уникальными и собрать в один файл.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.12.2019, 00:56
Помогаю со студенческими работами здесь

Есть ли в Oracle механизмы работы с очень большими объемами данных ?
Проблема такая: Есть база, которой пользуемся уже 4 года, структура базы такова, что есть несколько быстро растущих таблиц связанных с...

Какое ограничение в C#.NET на размер массивов? Или что посоветуете для работы с большими объемами данных?
Здравствуйте. Такой вопрос - пытаюсь создать двумерный массив размерностью 100000 на 100000 (тип int). Компилятор говорит мне - &quot;Не...

Видеокарта для работы с большими объемами графики
Доброй ночи! Прошу помочь в выборе карты, или связки из двух карт. Сейчас на компьютере стоит GF 9800 GT Green с 1GB DDR3 на борту....

Работа с большими базами данных, миллионы строк
Про шу помощи, есть вот такая таблица: SELECT , , , , , , ,

Работа с большими массивами данных в текстовом файле
Доброго времени суток. Уважаемые формучане на работе вознила следующая задача которую надо решить в маткад: Существует большой массив...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru