Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2011, 00:55   #1
trunc
 
Регистрация: 01.09.2010
Сообщений: 3
По умолчанию Ищу самый быстрый способ работы с файлами

Здравствуйте, уважаемые форумчане.
Имею прибор, который с дикой скоростью (350 кГц частота дискретизации) передает измерения в компьютер. Пока время измерения было 1 мин. - делал динамический массив, информацию запоминал, а потом спокойно обрабатывал.
Теперь попросили увеличить время до 5-ти минут. А комп то слабенький (Селерон 1,6 при памяти 256 МГб), виснет гад.

Поделитесь, пожалуйста, опытом по таким вопросам:
1. Поможет ли сливание всего в файл?
2. Если да, то какой способ выбрать?
Рассматриваю варианты: 1)просто запись блоками, 2)отображение в память; 3)объектная работа с файлами.

В какой из способов рекомендуете внедряться, как в самый быстрый?
Заранее вам благодарен.
trunc вне форума Ответить с цитированием
Старый 15.10.2011, 03:00   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

http://www.delphibasics.ru/AssignFile.php или http://www.delphibasics.ru/Assign.php
http://www.delphibasics.ru/Assigned.php
http://www.delphibasics.ru/ReWrite.php
http://www.delphibasics.ru/Write.php
http://www.delphibasics.ru/CloseFile.php или http://www.delphibasics.ru/Close.php

не использовать потоков(Tstream)...
Собственно TStream и основан на выше описанных методах.

Как вариант создать свой буффер памяти размером ну 50 мб минимум.
Данные с аппаратуры загоняются туда одним потоком, а второй поток успешно читает буфер и пишет в файл. Таким образом получается некий конвеер. Те. запись не на прямую(получил > записал) а (Получил > оставил в буфере > читаешь дальше[второй поток в этот момент загребает из буфера]).

Получается что-то ввиде конвеера. И думаю, что таким образом система не будет очень сильно нагружаться.


т.к. данные с аппаратуры > местечко в оперативе > отображение данных из оперативы в место на жостком диске.

Думаю варятли возможно отображать данные прямо на hdd без исп. оперативной памяти.

Последний раз редактировалось Человек_Борща; 15.10.2011 в 03:03.
Человек_Борща вне форума Ответить с цитированием
Старый 15.10.2011, 07:19   #3
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Думаю варятли возможно отображать данные прямо на hdd без исп. оперативной памяти.
Можно, но для этого нужно писать драйвер на Асме и работать через ПДП-канал минуя оперативу. Скорость передачи данных в 350кгц, это не очень высокая скорость. ПДП в паре с HDD может работать со скоростью примерно до 1 мгц.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 15.10.2011, 10:45   #4
trunc
 
Регистрация: 01.09.2010
Сообщений: 3
По умолчанию

Спасибо за ответы.

На счет Асма - че-то я очкую что не разберусь)
А вот насчет буферирования - похоже что надо попробовать.
Вот как я себе представляю:
1 делаю два буфера;
2 поток "приемник" по очереди их заполняет. В конце скидывает событие;
3 поток "сливатель" по событию записывает единым блоком каждый буфер в файл.

Нужно ли с приоритетами тут мутить, или и так заработает?
trunc вне форума Ответить с цитированием
Старый 15.10.2011, 11:00   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

нет не так. Если 2 буфера. какой смысл?
Инфа из одного в другой, сама не переместиться.
один читает от начала второй пишет в конец.
допустим если буфер размером в 50 мб, то оба потока хапают только по 25 мб.

модно ещё сообщения между потоками запилить, чтобы первый не пытался читать пустой буфер ,а второй писать в переполненый.
Человек_Борща вне форума Ответить с цитированием
Старый 15.10.2011, 11:11   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Инфа из одного в другой, сама не переместиться.
ей и не надо перемещаться. заполняем одни а сбрасываем другой. потом меняем их (указтели).
inputbuf:=buff1;
outbuff:=buff2;
заполняем buff1
сбрасываем buff2
потом делаем
inputbuf:=buff2;
outbuff:=buff1;
и теперь заполняем buff2
а сбрасываем buff2
а программы ни о чем и не догадываются как работали с inputbuf outputbuff так и работают. ну конечно же надо следить за местом в этих буферах.
собственно работает в основном прием данных. как только буфер заполнен переключаем буфера, инициируем сброс и продолжаем работу(прием).
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 15.10.2011, 12:21   #7
trunc
 
Регистрация: 01.09.2010
Сообщений: 3
По умолчанию

Здается мне, что 1-н буфер, деленный на 2, это то же самое, что 2- буфера.
Но в целом дело ясное, буду пробовать
trunc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Самый быстрый режим работы процессора Tronix Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 32 29.07.2011 21:01
Самый простой способ работы с файлами wwe2012 Общие вопросы C/C++ 4 28.03.2011 22:12
Самый быстрый браузер Marsel737 Софт 31 30.08.2010 01:09
Самый быстрый способ получить изображение в заданном прямоугольнике? TwiX Мультимедиа в Delphi 4 04.04.2010 10:08
Самый быстрый способ проверить прокси? TwiX Работа с сетью в Delphi 6 15.02.2010 22:41