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 будет быстрее.  
Страницы: 1
Читают тему
Наверх