реклама на сайте
подробности

 
 
> Ускорить запись в файл в Windows, Как уменьшить потери времени на запись в файл
Igor87
сообщение May 16 2010, 19:31
Сообщение #1





Группа: Участник
Сообщений: 9
Регистрация: 16-05-10
Пользователь №: 57 305



Есть задача: принимать данные от аппаратуры программой1 и через файл передавать их в программу2. Действие происходит в Windows XP.
При этом не устраивает скорость записи данных в файл. Передача осуществляется средствами WinAPI.
Есть ли более быстрые способы передачи данных?
Желательно минимальное изменение изменение кодов программ по причине того, что программу 1 и 2 делают разные люди.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Deka
сообщение May 28 2010, 09:48
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 248
Регистрация: 18-07-06
Из: Сочи
Пользователь №: 18 890



Можно попробовать сделать виртуальный диск и именно там расположить файл. Это позволит не переделывать программы.
Go to the top of the page
 
+Quote Post
Igor87
сообщение Jun 4 2010, 01:18
Сообщение #3





Группа: Участник
Сообщений: 9
Регистрация: 16-05-10
Пользователь №: 57 305



Цитата(Deka @ May 28 2010, 13:48) *
Можно попробовать сделать виртуальный диск и именно там расположить файл. Это позволит не переделывать программы.

А как это можно сделать?

По поводу CreatePipe, я читал, что все механизмы межпроцессного взаимодействия основаны на файлах отображаемых на память. И в пределе могут достигать скорости этого метода. Так что я пока остановился на файлах отображаемых в память. Вроде задержки уменшились, но возникла проблема того, что весь файл надо держать в памяти, а он может заполняться данными около часа.Там объем приличный может набегать.
Я думал, что можно отображать часть файла, но похоже ошибся.
Вот только память выделяется как-то не прямо пропорционально.То есть я вроде отображаю здоровый файл, а прибавка занимаемой памяти процессором маленькая.То есть механизм состоит не в том, что файл целиком находится в оперативной памяти, правильно?
Go to the top of the page
 
+Quote Post
Terrarium
сообщение Jun 7 2010, 14:21
Сообщение #4





Группа: Свой
Сообщений: 10
Регистрация: 9-12-07
Из: Москва
Пользователь №: 33 124



Цитата(Igor87 @ Jun 4 2010, 04:18) *
Вот только память выделяется как-то не прямо пропорционально.То есть я вроде отображаю здоровый файл, а прибавка занимаемой памяти процессором маленькая.То есть механизм состоит не в том, что файл целиком находится в оперативной памяти, правильно?


Для обмена данными с помощью общей памяти используются три функции:
CreateFile - собственно создаем начальный handle, который дублируем в другой программе,
CreateFileMapping - задаем, какого размера у нас будет общая память
MapViewOfFile - создаем "окно", в которое 1-й процесс пишет, 2-й - читает...

Поэтому, Вы можете создать большое общее пространство, и, открывая в нем "окна" небольшого размера для записи, записав, уведомлять считывающую программу о готовности очередного окна. Программа-считыватель открывает окно, читает, посылает уведомление пишущей, та закрывает окно, и оперативная память для данного окна освобождается. Поэтому реально выделенный объем будет равен ровно тому объему, который уже записан, но еще не прочитан. Далее, организуется запись "по кругу", когда вы по достижении конца файла начинаете писать в его начало. Если вы читаете быстрее, чем пишете, получится стабильная система.

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

Использование каналов, на мой взгляд, для данной задачи несколько удобнее, потому что вам не нужно заботиться о синхронизации - для случая с потоком, скажем, 1 мегабайт/с это вполне подойдет (если, конечно, приемник успевает "переварить" этот поток с точки зрения вычислительной трудоемкости). Кроме того, для ОС Линукс такой подход вообще стандартен - перенаправить вывод одной программы на ввод другой - например, результат поиска файлов на поиск шаблона имени а потом на программу сортировки. При этом вся буферизация/синхронизация ложится на ОС, и все работает очень эффективно - самому написать без вдумчивого анализа и большого опыта написания многопоточных программ вряд ли получится...

Если же потоки горазбо больше - гигабитный Ethernet фильтровать, к примеру, то, как альтернативу, предлагаю рассмотреть возможность использования MPI - ru.wikipedia.org/wiki/MPI - он изначально создавался для больших вычислительных систем с интенсивным обменом данными между различными процессами/узлами кластеров.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Igor87   Ускорить запись в файл в Windows   May 16 2010, 19:31
- - Xenia   Цитата(Igor87 @ May 16 2010, 23:31) Есть ...   May 16 2010, 19:47
|- - Igor87   Цитата(Xenia @ May 16 2010, 23:47) А если...   May 22 2010, 04:39
|- - Xenia   Цитата(Igor87 @ May 22 2010, 08:39) Вопро...   May 22 2010, 22:07
- - Igor87   Спасибо за ответ! Так как запись нужно вести в...   May 16 2010, 20:13
- - SSerge   Выбирайте что больше нравится из Interprocess Comm...   May 16 2010, 20:50
|- - SSerge   Цитата(Igor87 @ Jun 4 2010, 08:18) файл ц...   Jun 5 2010, 09:00
- - baralgin   Как выше советовали, можно использовать именованны...   May 28 2010, 12:15
- - Xenia   Я не буду слишком категоричной, но в отношении мех...   May 28 2010, 15:53
- - SSerge   Буферизация у пайпов конечно же есть. Собственно т...   May 28 2010, 16:53
- - alekseykoj   Смотри в сторону API функций: CreateFileMapping, M...   Jun 3 2010, 09:12
- - Igor87   А GetSystemInfo() говорит, что гранулярность памят...   Jun 13 2010, 16:08


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th June 2025 - 19:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01437 секунд с 7
ELECTRONIX ©2004-2016