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
11089
Atom001 в сообщении #1516389 писал(а):
Попробывал на С программку сделать, но она подряд более, чем $\sim$6700 точек отказывается скушивать.
Обрабатывайте построчно без сохранения точек в массив. Некоторые упомянутые вами величины потребуют нескольких проходов по файлу.

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


14/01/11
3125
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
11089
На самом деле, ТС тут полезно почитать, как люди обрабатывали данные полвека назад, когда нормальным были машины с десятками килобайт оперативки, но с кучей накопителей на магнитных лентах в качестве периферии.

 Профиль  
                  
 
 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
11089
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
11089
Atom001 в сообщении #1516420 писал(а):
Паскаль только
Вот нагуглился и Паскаль: https://www.freepascal.org

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


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


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

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


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

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


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

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

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



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

Сейчас этот форум просматривают: granit201z


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

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