2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2, 3, 4, 5  След.
 
 Чем обработать 8 Гб данных?
Сообщение02.05.2021, 12:46 
Аватара пользователя


13/02/13
777
♍ — ☉ — ⊕
Добрый день!
Имется .txt файл, содержащий значения некой функции от линейно увеличивающегося аргумента. Всего в файле содержится около 400 000 000 точек. Нужно провести анализ и получить, например, такие величины: среднее арифметическое всех значений функции, абсолютные максимум и минимум, локальные максимум и минимум на заданных интервалах, факт выхода значения функции за пределы окна $\pm$n% от среднего или от заданного пользователем, а также значения аргумента, когда такой выход произошёл.
Не подскажите, в какой программе всё это можно провернуть? Попробывал на С программку сделать, но она подряд более, чем $\sim$6700 точек отказывается скушивать.

 Профиль  
                  
 
 Re: Чем обработать 8 Гб данных?
Сообщение02.05.2021, 12:51 


27/08/16
10450
Atom001 в сообщении #1516389 писал(а):
Попробывал на С программку сделать, но она подряд более, чем $\sim$6700 точек отказывается скушивать.
Обрабатывайте построчно без сохранения точек в массив. Некоторые упомянутые вами величины потребуют нескольких проходов по файлу.

 Профиль  
                  
 
 Re: Чем обработать 8 Гб данных?
Сообщение02.05.2021, 12:54 


14/01/11
3062
Atom001 в сообщении #1516389 писал(а):
Попробывал на С программку сделать, но она подряд более, чем $\sim$6700 точек отказывается скушивать.

Это вы какую-то неправильную программку сделали, только и всего.

-- Вс май 02, 2021 12:55:30 --

Можете здесь привести её текст в части чтения из файла?

 Профиль  
                  
 
 Re: Чем обработать 8 Гб данных?
Сообщение02.05.2021, 12:59 
Заслуженный участник


09/05/12
25179
Sender в сообщении #1516393 писал(а):
Можете здесь привести её текст в части чтения из файла?
Лучше целиком. Маловероятно, что она уж очень большая, а проблема больше похожа на неаккуратную работу с памятью.

 Профиль  
                  
 
 Posted automatically
Сообщение02.05.2021, 12:59 
Заслуженный участник


09/05/12
25179
 i  Тема перемещена из форума «Свободный полёт» в форум «Программирование»
Причина переноса: тематика.

 Профиль  
                  
 
 Re: Чем обработать 8 Гб данных?
Сообщение02.05.2021, 13:07 


27/08/16
10450
На самом деле, ТС тут полезно почитать, как люди обрабатывали данные полвека назад, когда нормальным были машины с десятками килобайт оперативки, но с кучей накопителей на магнитных лентах в качестве периферии.

 Профиль  
                  
 
 Re: Чем обработать 8 Гб данных?
Сообщение02.05.2021, 13:19 
Аватара пользователя


13/02/13
777
♍ — ☉ — ⊕
Проблема ещё и в том, что программирую на си второй или третий раз в жизни, да и вообще программированием особо никогда не занимался.

Ниже код программы. Кода непосредственно обработки считанных данных ещё нет. Использую кучу массивов для хранения информации. Думаю, правда, стоит обрабатывать данные без записи в массив.
код: [ скачать ] [ спрятать ]
Используется синтаксис C
#include <stdio.h>
#include <stdlib.h>
int max_size_of_array = 6700; // размер массива считанных из файла строк
int max_length_of_string = 100; // максимальная длина считанной строки
int num_of_start_string = 34; // номер строки, с которой начинаются анализ-able числовые данные

int main(){
        int i, j, counter; // вспомогательные переменные-счётчики
        char str[max_size_of_array][max_length_of_string]; // массив строк, считанных из файла
        char time_str[max_size_of_array][max_length_of_string]; // массив значений аргумента (тип string)
        char voltage_str[max_size_of_array][max_length_of_string]; // массив значений функции (тип string)
        int time[max_size_of_array]; // массив значений аргумента (тип integer)
        float voltage[max_size_of_array]; // массив значений функции (тип float)
       
        /*** заполнение всех массивов нулями, чтобы избежать заполненией абракадаброй ***/
        memset(str, 0, sizeof(str));
        memset(time_str, 0, sizeof(time_str));
        memset(voltage_str, 0, sizeof(voltage_str));
        memset(time, 0, sizeof(time));
        memset(voltage, 0, sizeof(voltage));
       
        FILE *myFile; // объявляем файл
        myFile = fopen("test_file.txt", "r"); // открываем файл
        if (myFile != NULL){ // проверка успешности открытия файла
                printf("File is successfully opened\n");
        } else {
                printf("File could not be opend\n");
        }
       
        for (i = 0; i < max_size_of_array; i++){ // построчное чтение из файла в массив
                fgets(str[i], max_length_of_string, myFile);
        }
       
        for (i = num_of_start_string; i < max_size_of_array; i++){ // первичная обработка считанных полезных данных
                for (j = 0; j <= strlen(str[i]); j++){ // определяем место разделителя ;
                        if (str[i][j] == ';'){
                                counter = j;
                        }
                }
                for (j = 0; j < counter; j++){ // до разделителя ; находится аргумент
                        time_str[i][j] = str[i][j];
                }
                time[i] = atoi(time_str[i]); // аргумент-строка — в аргумент-число
               
                for (j = counter + 1; j <= strlen(str[i]); j++){ // после разделителя ; находится функция
                        voltage_str[i][j-counter-1] = str[i][j];
                }
               
                for (j = 0; j <= strlen(voltage_str[i]); j++){ // меняем десятичный разделитель с , на .
                        if (voltage_str[i][j] == ','){
                                voltage_str[i][j] = '.';
                        }
                }

                voltage[i] = atof(voltage_str[i]); // функция-строка — в функцию-число
        }
}

 Профиль  
                  
 
 Re: Чем обработать 8 Гб данных?
Сообщение02.05.2021, 13:29 
Заслуженный участник


09/05/12
25179
Atom001 в сообщении #1516414 писал(а):
Проблема ещё и в том, что программирую на си второй или третий раз в жизни
А почему тогда на C? Это не самый удобный язык для подобных целей, особенно если вы им толком не владеете. Что-нибудь еще вы знаете?

Но проблема, да, в попытках считать все в память и сделать статические массивы, которые при таких объемах попросту не лезут в стек. Соответственно, надо либо менять алгоритмы, обрабатывая данные без полной загрузки их в память, либо, если на доступном компьютере заметно больше 8 Гб оперативной памяти, просто переделать массивы в динамические.

P.S. Я переделал оформление кода в вашем сообщении - для таких целей лучше использовать тэг syntax.

 Профиль  
                  
 
 Re: Чем обработать 8 Гб данных?
Сообщение02.05.2021, 13:30 


27/08/16
10450
Atom001 в сообщении #1516414 писал(а):
Проблема ещё и в том, что программирую на си второй или третий раз в жизни, да и вообще программированием особо никогда не занимался.
От языка программироавния это мало зависит. Обрабатывайте построчно: считали строку из файла, преобразовали в плавающее число, обработали. С целыми статистику вам считать нельзя. Для обработки вам нужно представить желаемую статистику в инкрементальном виде, когда к ней можно добавлять значения по одному. Например, для подсчёта среднего накапливаете сумму, прибавляя по одному числу, и отдельно накапливаете количество просуммированных чисел. В конце делите. Для некоторых желаемых величин, вроде количества выбросов за полосой с центром на среднем, нужно сделать два прохода: сначала посчитать таким образом среднее, закрыть файл, открыть его заново с начала и вторым проходом посчитать количество аутлайеров.

-- 02.05.2021, 13:33 --

Pphantom в сообщении #1516415 писал(а):
либо, если на доступном компьютере заметно больше 8 Гб оперативной памяти, просто переделать массивы в динамические.
Тогда на нём можно запустить, например, Matlab, и считать всё в нём. Видимо, проблема не в этом.

 Профиль  
                  
 
 Re: Чем обработать 8 Гб данных?
Сообщение02.05.2021, 13:52 
Аватара пользователя


13/02/13
777
♍ — ☉ — ⊕
Pphantom в сообщении #1516415 писал(а):
А почему тогда на C? Это не самый удобный язык для подобных целей, особенно если вы им толком не владеете. Что-нибудь еще вы знаете?

Паскаль только :facepalm: А С - наиболее знакомый после Паскаля.

Pphantom в сообщении #1516415 писал(а):
P.S. Я переделал оформление кода в вашем сообщении - для таких целей лучше использовать тэг syntax.

Спасибо, буду знать.

realeugene в сообщении #1516416 писал(а):
Тогда на нём можно запустить, например, Matlab, и считать всё в нём. Видимо, проблема не в этом.

Да, 8 Гб оперативной памяти и близко нет. А я хотел в лоб таким образом обработать 8+ Гб файл...

realeugene в сообщении #1516416 писал(а):
Для обработки вам нужно представить желаемую статистику в инкрементальном виде, когда к ней можно добавлять значения по одному. Например, для подсчёта среднего накапливаете сумму, прибавляя по одному числу, и отдельно накапливаете количество просуммированных чисел. В конце делите. Для некоторых желаемых величин, вроде количества выбросов за полосой с центром на среднем, нужно сделать два прохода: сначала посчитать таким образом среднее, закрыть файл, открыть его заново с начала и вторым проходом посчитать количество аутлайеров.

Именно так и собираюсь сделать. Среднее уже определил, причём удивительно шустро.

Всем спасибо! Напишу программу, обрабатывающую данные в режиме онлайн. А если что-то не получится, то сюда ещё напишу.

 Профиль  
                  
 
 Re: Чем обработать 8 Гб данных?
Сообщение02.05.2021, 13:58 
Заслуженный участник


09/05/12
25179
Atom001 в сообщении #1516420 писал(а):
Паскаль только
И почему нет? Вполне сойдет, если только вы сколько-нибудь современный компилятор используете, а не BP7.0 1992 года.

 Профиль  
                  
 
 Re: Чем обработать 8 Гб данных?
Сообщение02.05.2021, 14:01 


27/08/16
10450
Atom001 в сообщении #1516420 писал(а):
Паскаль только
Вот нагуглился и Паскаль: https://www.freepascal.org

 Профиль  
                  
 
 Re: Чем обработать 8 Гб данных?
Сообщение02.05.2021, 18:24 


10/04/12
705
Atom001 в сообщении #1516420 писал(а):
Да, 8 Гб оперативной памяти и близко нет. А я хотел в лоб таким образом обработать 8+ Гб файл...


Я в клауде арендовал машины до 1T оперативной памяти, если надо разово что-то посчитать. Но 6700 точек очень мало для сохранения, это кибобайты, что доступно сейчас абсолютно везде.

 Профиль  
                  
 
 Re: Чем обработать 8 Гб данных?
Сообщение02.05.2021, 18:55 
Экс-модератор
Аватара пользователя


23/12/05
12064
А нельзя ли сразу разбить исходный файл на пачку файлов с вменяемыми размерами и, скажем, своим названием определяющих диапазон аргументов, результаты к которому в данном файле? - работать с таким будет проще

 Профиль  
                  
 
 Re: Чем обработать 8 Гб данных?
Сообщение02.05.2021, 19:20 


27/08/16
10450
Atom001
при накоплении статистики используйте double, а не float. И даже с ним может быть заметная потеря точности на миллиардах слагаемых.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 70 ]  На страницу 1, 2, 3, 4, 5  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group