Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 20.06.2015
Сообщений: 11

Работа с бинарным файлом без загрузки в оперативную память

04.04.2017, 02:16. Показов 1529. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Пишу программу для обработки Холтеровских (суточных) записей ЭКГ. С прибора выгружается бинарный файл размером до 512 Мб ( 121МБ = 24часа в приборе памяти 512Мб обычно пишут от 1 до 3х суток) файл содержит три канала по следующей архитектуре: 2 байта - значение первого канала, следующие два байта значение второго канала, следующие два байта значение третьего канала, и т.д. 1ый второй третий до конца файла без лишней информации (если третий канал не используется - он содержит нулевые значения - программа это замечает и выкидывает его из дальнейшей обработки). Суть обработки заключается в нахождении позиций QRS-комплексов, подсчету RR-интервалов и записи в int массив с частотой дискретизации 1Гц (раз в секунду) значений RR-интервалов - т.е за сутки 86400 значений. Дальнейшая работа будет происходить только с этим массивом, а ЭКГ мне не нужна.
Я использую следующий код чтобы перегнать данный файл в массивы по каждому каналу:

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
                                               // глобальные переменные
DynamicArray<uint16_t> bt1;     //двоичные данные 1 канала
DynamicArray<uint16_t> bt2;    //двоичные данные 2 канала
DynamicArray<uint16_t> bt3;   //двоичные данные 3 канала
DynamicArray<int> ecg1;      //числовые данные 1 канала
DynamicArray<int> ecg2;     //числовые данные 2 канала
DynamicArray<int> ecg3;    //числовые данные 3 канала
long int fsize;           //количество отсчетов ; in3*6=размер файла(байт)
int in3 = 0;             //  1 - в записи есть 3 канал; 0 - без 3го канала
 
//---------------------------------------------------------------------------
 
{
FILE *fpl;
AnsiString filename;
if(OpenDialog1->Execute()){
  filename = OpenDialog1->FileName;
  fpl=fopen(filename.c_str(),"rb");
  fsize = (filelength(fileno(fpl)))/6;
bt1.Length = fsize;
bt2.Length = fsize;
bt3.Length = fsize;
uint8_t * buf = (uint8_t*) malloc(1);
rewind(fpl);
ecg1.Length = fsize;
ecg2.Length = fsize;
for(int i = 0; i<fsize; i++){
  fread(&buf, 1, 1, fpl);
  bt1[i]= uint8_t(buf);
  bt1[i]<<=8;
  fread(&buf, 1, 1, fpl);
  bt1[i]=bt1[i]+uint8_t(buf);
  ecg1[i]= int(bt1[i]);
  fread(&buf, 1, 1, fpl);
  bt2[i]= uint8_t(buf);
  bt2[i]<<=8;
  fread(&buf, 1, 1, fpl);
  bt2[i]=bt2[i]+uint8_t(buf);
  ecg2[i]= int(bt2[i]);
  fread(&buf, 1, 1, fpl);
  bt3[i]= uint8_t(buf);
  bt3[i]<<=8;
  fread(&buf, 1, 1, fpl);
  bt3[i]=bt3[i]+uint8_t(buf);}}
bt1.Length = 0;
bt2.Length = 0;
int L = 0;
for (int i=0; i<(fsize/144); i++)
  L=L+int(bt3[i]);
if (L>0){
  in3 = 1;
  ecg3.Length = fsize;
  for (int i=0; i<fsize; i++)
    ecg3[i]=int(bt3[i]);
  }
bt3.Length = 0;
}
код работает, я получаю в массивах ecg1 , 2 и 3 свои данные но при этом моя программа занимает 170Мб в ОЗУ ( на два канала) только на открытие файла. Если у меня будет три канала по трое суток в ОЗУ окажется 0,5Гб данных, а в дальнейшем если придется работать с файлами с других приборов с большей частотой дискретизации (одна запись до 2Гб) держать всю запись в ОЗУ будет проблемно.
Как можно организовать обработку записи "из файла" не выгружая ее целиком в опервтивку?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.04.2017, 02:16
Ответы с готовыми решениями:

Влияние ресурсов на оперативную память и скрость загрузки
Здравствуйте, помогите пожалуйста разобраться как Unity работает с ресурсами. Предположим у нас есть текстура 10мб и она лежит в Assets: ...

Работа с бинарным файлом
Здравствуйте, есть функция на delphi, которая записывает информацию в файл. procedure TPeople.LoadFromFile(const FileName: string); var...

Работа с бинарным файлом
почему программа не выводит 16-ричный дамп бинарного файла? int main () { streamoff lSize; char *buffer; ifstream...

2
+1
345 / 178 / 53
Регистрация: 24.08.2010
Сообщений: 1,028
04.04.2017, 07:50
А где у тебя закрытие и очистка файла?
Вот он и висит у тебя в оперативе.
0
0 / 0 / 0
Регистрация: 20.06.2015
Сообщений: 11
15.04.2017, 00:16  [ТС]
В дальнейшем я прикрутил закрытие файла, а так же очистку массивов bt1, 2 ,3. сей час в оперативе висит только ecg1 ecg2 43200000 значений типа int на одни сутки записи. Если не ошибаюсь 4 байта на одно значение типа int а это в свою очередь 164,8 Мб оперативки на сутки.Да, То что эти данные хранятся в оперативке значительно ускоряет работу, если у меня уходит на чтение файла в оперативку приведенным кодом около 1.5 минуты то на обработку (в приведенном коде этого нет) - поиск R зубцов (а это прогон по всей записи окна в 300 отсчетов с операциями в этом окне) около 20 секунд, но:

Поставлю вопрос иначе: хочу использовать временные файлы для хранения больших массивов типа ecg1 - 2 в моем коде. допустим при открытии большой записи не хватает оператвики ( для современных пк сложно такое вообразить но все же мне в итоге с этой программой работать в универе и возможно на их компах которым по 10+ лет). Можно ли писать массив в .tmp файл и работать с ним не загружая в оперативку?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.04.2017, 00:16
Помогаю со студенческими работами здесь

Работа с бинарным файлом
Ребята, подскажите, правильно ли делаю? Вводятся три числа и нужно поменять в бинарном файле местами первый и последний элемент. К примеру...

Работа с бинарным файлом
подскажите пожалуйста как перезаписать определенную область в бинарном файле. именно конкретный участок

Работа с бинарным файлом
Можно ли из бинарного файла выписывать строки?

Работа с бинарным файлом
Доброго времени суток всем. Помогите пожалуйста доделать задачу: Создать класс для работы с бинарным файлом. В файл записать...

Работа с бинарным файлом
помогите, пожалуйста Дан бинарный файл, содержащий числа а1, b1, a2, b2... Каждая пара чисел a и b определяет числитель и знаменатель...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru