Cкорость обмена данными через файлы

Страницы: 1
RSS
Cкорость обмена данными через файлы
 
Добрый день,
Эта тема в основном для начинающих строителей роботов.
--------------------------
На вопрос  как сохранить или как передать данные в другой скрипт и приложение,
я рекомендую начать с обмена через файлы.
--------------------
Как правило в ответ получаю - через файлы - это медленно.
На вопрос -откуда Вы это знаете -обычно ответа нет.
----------------
Аналогичный вопрос возникает при попытке передать данные из одного приложения в другое.
---------------
Тем кто,  знает С for Lua, рекомендую mapping files, как самый универсальный и быстрый способ обмена,
если Вас не устраивает обычный обмен через файлы.
---------------
В этой теме я покажу как "медленно" реализуется обмен через файлы.
===============
Тест обмена через файлы в одном приложении.
-------------------
Написал вот такой тест:
Код
pD ="D:/QUIK_SCRIPT/nk_bot/Data/"
fn=pD..name..".log";  Log=io.open(fn,"w");
pDA ="D:/QUIK_SCRIPT/nk_bot/DataA/"
fnA=pDA..name..".log"; LogA=io.open(fnA,"w");
--------------------
local nF=nkevent.ccf(fn);
local nFA=nkevent.ccf(fnA);
local _,_,dHMS1=nkvm.D();
for j=1,100 do
     local _,_,dHMS=nkvm.D(); d=(1000000.*(dHMS-dHMS1))//1;
    Log:write(j..","..dHMS..","..d.."\n");Log:flush();
    while true do
   if nkevent.wcf(nF) then  dHMS1=dHMS; local  C=Log; Log=LogA; LogA=C; local x=nF; nF=nFA; nFA=x  break; end
   end
end
Что он делает?
Создаем на диске два каталога Data и DataA до запуска скрипта.
Скрипт открывает  в каждом из каталогов файл test.log.
-------------------
Далее в цикле 100 раз производится
запись с нечетным j в файл в Каталоге Data.
При обнаружении записи в файл , производим запись в файл в каталоге DataA по четным значениям j.
------------------
Таким образом, в файл каталога Data записываются ответы на запись в файл каталога DataA и наоборот.
---------------------
Каждая запись содержит значения j, текущее время и  задержку обнаружения записи в очередной файл.

Результат  Data/test.log:
Код
1,151047.6863891,790.0
3,151047.6865335,61.0
5,151047.6865586,10.0
7,151047.6865764,8.0
9,151047.6865931,8.0
11,151047.6866097,8.0
13,151047.6866333,15.0
15,151047.6866505,8.0
17,151047.6866669,8.0
19,151047.686683,8.0
21,151047.6866992,8.0
23,151047.6867155,8.0
25,151047.6867317,8.0
27,151047.6867478,8.0
29,151047.6867637,7.0
31,151047.6867809,8.0
33,151047.6867971,8.0
35,151047.6868131,8.0
37,151047.6868292,8.0
39,151047.6868453,8.0
41,151047.6868614,8.0
43,151047.6868775,8.0
45,151047.6868937,8.0
47,151047.6869098,8.0
49,151047.686926,8.0
51,151047.6869421,8.0
53,151047.6869583,8.0
55,151047.6869748,8.0
57,151047.6869909,8.0
59,151047.6870071,8.0
61,151047.687025,8.0
63,151047.6870415,8.0
65,151047.687059,8.0
67,151047.6870752,8.0
69,151047.6870911,8.0
71,151047.6871073,8.0
73,151047.6871234,8.0
75,151047.6871394,8.0
77,151047.6871554,8.0
79,151047.6871715,8.0
81,151047.6871876,8.0
83,151047.6872036,8.0
85,151047.6872198,8.0
87,151047.687236,8.0
89,151047.6872521,8.0
91,151047.6872683,8.0
93,151047.6872844,8.0
95,151047.6873004,8.0
97,151047.6873165,8.0
99,151047.6873325,8.0
Результат  DataA/test.log:
Код
2,151047.6864724,83.0
4,151047.6865484,14.0
6,151047.6865676,9.0
8,151047.6865849,8.0
10,151047.6866013,8.0
12,151047.6866179,8.0
14,151047.686642,8.0
16,151047.6866586,8.0
18,151047.6866749,8.0
20,151047.6866911,8.0
22,151047.6867072,7.0
24,151047.6867237,8.0
26,151047.6867397,8.0
28,151047.6867558,8.0
30,151047.6867727,8.0
32,151047.686789,8.0
34,151047.686805,7.0
36,151047.6868212,8.0
38,151047.6868372,7.0
40,151047.6868533,8.0
42,151047.6868695,8.0
44,151047.6868856,8.0
46,151047.6869017,8.0
48,151047.6869179,8.0
50,151047.686934,8.0
52,151047.6869502,8.0
54,151047.6869665,8.0
56,151047.6869828,8.0
58,151047.686999,8.0
60,151047.6870167,9.0
62,151047.6870333,8.0
64,151047.6870509,9.0
66,151047.687067,8.0
68,151047.6870831,7.0
70,151047.6870991,8.0
72,151047.6871153,8.0
74,151047.6871314,7.0
76,151047.6871474,8.0
78,151047.6871635,8.0
80,151047.6871795,8.0
82,151047.6871956,8.0
84,151047.6872116,7.0
86,151047.6872278,8.0
88,151047.687244,8.0
90,151047.68726,7.0
92,151047.6872763,8.0
94,151047.6872924,8.0
96,151047.6873085,8.0
98,151047.6873245,8.0
100,151047.6873405,8.0
Самое смешное то ,
что задержка измеряется в мкс
и составляет в среднем не более  10 . т.е. 0.000001 сек.
-------------------------
Это медленно?  
 
Вот результаты теста обмена данными через файл двух приложений.
-----------------
Запускаю два приложения на луа.
Каждое приложение записывает свое сообщение в файл  в ответ на поступившее сообщение от другого приложения.
Поступившее сообщение выводится в окно приложения.
вот так это работает

а это содержимое файла через который выполняется обмен сообщениями
Первое число в строке - задержка между сообщениями в мкс.
Второе число - размер файла в данный момент.
В среднем задержка обмена составляет 0.2 ms или 0.0002 сек.
Код
277.0,91,script 2
274.0,110,script 1
271.0,130,script 2
271.0,150,script 1
271.0,170,script 2
245.0,190,script 1
243.0,210,script 2
402.0,230,script 1
403.0,250,script 2
366.0,270,script 1
361.0,290,script 2
358.0,310,script 1
352.0,330,script 2
345.0,350,script 1
348.0,370,script 2
301.0,390,script 1
268.0,410,script 2
232.0,430,script 1
228.0,450,script 2
228.0,470,script 1
227.0,490,script 2
153.0,510,script 1
153.0,530,script 2
146.0,550,script 1
149.0,570,script 2
154.0,590,script 1
155.0,610,script 2
152.0,630,script 1
150.0,650,script 2
150.0,670,script 1
149.0,690,script 2
149.0,710,script 1
148.0,730,script 2
150.0,750,script 1
179.0,770,script 2
187.0,790,script 1
162.0,810,script 2
150.0,830,script 1
148.0,850,script 2
146.0,870,script 1
165.0,890,script 2
186.0,910,script 1
166.0,930,script 2
146.0,950,script 1
147.0,970,script 2
149.0,990,script 1
148.0,1010,script 2
145.0,1031,script 1
147.0,1052,script 2
150.0,1073,script 1
147.0,1094,script 2
145.0,1115,script 1
148.0,1136,script 2
150.0,1157,script 1
149.0,1178,script 2
151.0,1199,script 1
153.0,1220,script 2
149.0,1241,script 1
147.0,1262,script 2
149.0,1283,script 1
147.0,1304,script 2
145.0,1325,script 1
147.0,1346,script 2
149.0,1367,script 1
147.0,1388,script 2
145.0,1409,script 1
148.0,1430,script 2
151.0,1451,script 1
148.0,1472,script 2
145.0,1493,script 1
147.0,1514,script 2
150.0,1535,script 1
151.0,1556,script 2
150.0,1577,script 1
156.0,1598,script 2
157.0,1619,script 1
147.0,1640,script 2
145.0,1661,script 1
148.0,1682,script 2
150.0,1703,script 1
148.0,1724,script 2
145.0,1745,script 1
182.0,1766,script 2
183.0,1787,script 1
148.0,1808,script 2
150.0,1829,script 1
147.0,1850,script 2
144.0,1871,script 1
147.0,1892,script 2
149.0,1913,script 1
147.0,1934,script 2
145.0,1955,script 1
148.0,1976,script 2
150.0,1997,script 1
147.0,2018,script 2
145.0,2039,script 1
148.0,2060,script 2
149.0,2081,script 1
147.0,2102,script 2
145.0,2123,script 1
147.0,2144,script 2
149.0,2165,script 1
147.0,2186,script 2
149.0,2207,script 1
152.0,2228,script 2
149.0,2249,script 1
148.0,2270,script 2
147.0,2291,script 1
147.0,2312,script 2
150.0,2333,script 1
184.0,2354,script 2
191.0,2375,script 1
208.0,2396,script 2
205.0,2417,script 1
203.0,2438,script 2
213.0,2459,script 1
216.0,2480,script 2
205.0,2501,script 1
203.0,2522,script 2
204.0,2543,script 1
203.0,2564,script 2
203.0,2585,script 1
203.0,2606,script 2
203.0,2627,script 1
203.0,2648,script 2
203.0,2669,script 1
201.0,2690,script 2
200.0,2711,script 1

 
если вывод сообщения на экран убрать, то время обмена сократится до 60 мкс.
Код
51.0,107,script 1
49.0,126,script 2
49.0,145,script 1
60.0,164,script 2
69.0,183,script 1
58.0,202,script 2
48.0,221,script 1
49.0,240,script 2
49.0,259,script 1
48.0,278,script 2
47.0,297,script 1
48.0,316,script 2
48.0,335,script 1
47.0,354,script 2
48.0,373,script 1
48.0,392,script 2
48.0,411,script 1
48.0,430,script 2
48.0,449,script 1
48.0,468,script 2
48.0,487,script 1
48.0,506,script 2
48.0,525,script 1
48.0,544,script 2
47.0,563,script 1
48.0,582,script 2
48.0,601,script 1
48.0,620,script 2
48.0,639,script 1
48.0,658,script 2
48.0,677,script 1
48.0,696,script 2
48.0,715,script 1
48.0,734,script 2
52.0,753,script 1
52.0,772,script 2
48.0,791,script 1
47.0,810,script 2
47.0,829,script 1
47.0,848,script 2
47.0,867,script 1
47.0,886,script 2
48.0,905,script 1
58.0,924,script 2
72.0,943,script 1
63.0,962,script 2
53.0,981,script 1
 
Через файлы это хорошо, сам пользую. Как для передачи, так и для сохранения для последующего запуска. Вот только бэкапится приходится т.к. при коллизиях
и вывыливании терминала в дамп файлы частенько бьются. А поскольку в файл писать приходится часто это становится проблемой.
 
Последний эксперимент - mapping files.
Создается файл, в который два скрипта пишут письма друг другу по очереди,
так же как во втором эксперименте.
---------------
Однако в этом случае. делается проекция файла в память. Приложения фактически обмениваются через память, при этом выполняется и запись в файл.
-------------
картинка работы приложений.




В файл каждое приложение выводит текущее время с квантом 0.1 мкс.
Для определения задержки обмена сообщения на экран отключены
Первое число - длина текста в строке
Результат в файле:
Код
23,171811.8128928,script2
23,171811.8128937,script1
23,171811.8128957,script2
23,171811.8128971,script1
23,171811.8128975,script2
23,171811.8128984,script1
23,171811.8128992,script2
23,171811.8129006,script1
23,171811.8129008,script2
23,171811.8129019,script1
23,171811.8129023,script2
23,171811.8129061,script1
23,171811.8129063,script2
23,171811.8129074,script1
23,171811.8129078,script2
23,171811.8129086,script1
23,171811.8129093,script2
23,171811.8129108,script1
23,171811.8129111,script2
23,171811.8129131,script1
23,171811.8129133,script2
23,171811.8129144,script1

Величина задержки определяется как разность времени соседних сообщений
Выборка из расчета задержки
Код
 0.900006853
 1.40001066
 0.900006853
 1.399981556
 1.100008376
 3.799999831
 1.099979272
 0.800006092

Величина задержки получилась менее  3 мкс.
-------------------  
Таким образом, при обмене не то что потоков, а приложений, через файлы с отображением в память
задержка сообщений не более 3 мкс.  
 
Цитата
Kolossi написал:
Через файлы это хорошо, сам пользую. Как для передачи, так и для сохранения для последующего запуска. Вот только бэкапится приходится т.к. при коллизиях
и вывыливании терминала в дамп файлы частенько бьются. А поскольку в файл писать приходится часто это становится проблемой.
Как видно из экспериментов выше, время обмена через файлы,
особенно с отображением в память, меньше, чем вызов не сложной  функций на любом скриптовом языке.
---------------------
Но если это разные потоки или приложения, то надо синхронизировать, чтобы не было проблем.
------------------
Я предпочитаю синхронизацию без блокировки.
Проблем нет.
 
сделал тест обмена данными приложения Lua и  Python.
--------------------
для mapping falles скорость обмена 21 МБ/сек.
Просто файлами  0.8 МБ/сек.
Аналогично между приложениями на Lua.
------------------
Функции обмена реализованы на С.
 
А если диск виртуальный, то как по сравнению с маппинг филес?
 
Цитата
Serge123 написал:
А если диск виртуальный, то как по сравнению с маппинг филес?
У меня нет виртуального диска.
Могу предположить что разницы в скорости нет так как обмен практически через память ,
но в маппинге параллельно получаем файл в энергонезависимой памяти (диске). и нет надобности тратить память на виртуальный диск.
Ну и безусловно, если данных  сотни гигабайт или терабайты, то никакой виртуальный диск  не поможет.
------------------------------
Возможно обмен через Shared Memory будет быстрее.  
 
Говорят, что все новое - это хорошо забытое старое.
---------------------
Решил обновить тему обмена данными между скриптами.
Выше я привел результаты тестов.
----------------------------
Но вопрос у меня следующий.
---------------------------
Знаете ли Вы какая у Вас будет задержка обмена данными между Вашими скриптами?
-----------------------------
Если не знаете, то могу Вас удивить.
-----------------------
Величина этой задержки будет равна значению функции sleep, которую Вы ставите в цикле main.
Если вы написали sleep(1000) то какой бы метод обмены Вы не применили задержка передачи данных будет 1 секунда.
---------------------------
В итоге реально вы не получите задержку менее 15 ms, что соответствует sleep(10).
Отказаться от sleep можно лишь используя Event OS.
-----------------------
Из этого можно следующий вывод.
Если Вы не профессионально пишите софт, то для обмена данными как между скриптами так и с другими приложениями например на питоне
применение обмена через файлы самый простой, быстрый и надежный способ, если Вы знаете как его правильно реализовать.
----------------------------
И еще один печальный вывод.
Функция main это отдельный поток. Казалось бы , что запустив 5 скриптов можно получить робота с 5 потоками и будет он в 5 раз быстрее считать.
Но как бы не так.
В каждом скрипте поток будет тормозится на время sleep.  
и в итоге ускорение либо будет либо нет.
Скорее нет.
------------------------------
Т е sleep в потоке - это тормоз.  
 
Чтобы получить действительно ускорение расчетов на основе множества скриптов надо использовать Event OS не только для синхронизации колбеков QUIK и потока main, но и для синхронизации обмена между скриптами.
В этом случае обмен имет смысл строить на основе Memory-mapped files.  При этом скорость обмена между скриптами по сравнению с обменом через файлы будет примерно в 100 и более раз быстрее.
Страницы: 1
Читают тему
Наверх