Финансы без пpоблем: Пеpеговоpный Пункт II (http://hdru.com/cgi-bin/pp2/YaBB.cgi)
>> Общий pаздел >> Быстрый вывод в файл
(Message started by: Vladimir на 16.12.16 в 23:59:16)

Заголовок: Быстрый вывод в файл
Прислано пользователем Vladimir на 16.12.16 в 23:59:16
Что-то не хватает функции поиска на форуме. Стандартное решене Гугла было бы к стати.

Я, собственно, во о чем.
Где-то проходила информация (не нашел) о том, что  долго формируется отчет в файле на диске и связяно это с постоянными открытиями-закрытиями файла, еще, возможно, притормаживает антивирус...

У меня есть отчет, который занимет 20 метров на диске и грозит существенно увеличиться. Для ускорения его  формированя на диске я применил буферизирование. Вот подпрограммы которые я успешно  применяю уже 6 месяцев.

*******************************
*    Buffered file operations                    *
*******************************
* Инициализация файла
* Файл усекается до нулевой длины
:INITFILE (F)  
[set %, F, 0]
\>file F              
return
********************
* Вывод в буфер
* при переполнении буфер будет скинут на диск
: PRINTBUF (F, S)
local BF, LS, LB
 LS = [length S]
 BF = [get %, F]
 if BF = 0
   [set %, F, S]
 else
   LB = [length BF]
   if LS + LB > 255
     [:FLUSHBUF F]
     [set %, F, S]
   else
     [plus %, F, S]
   endif
 endif
return
******************
* Принудительный сброс буфера на диск
* Этой ПП должен завершаться буферизованный вывод
:FLUSHBUF (F)
 [: PRINTF F, [get %, F]
 [set %, F, 0]
return
*

Заголовок: Re: Быстрый вывод в файл
Прислано пользователем Boris, Kiev. на 17.12.16 в 15:08:12

on 12/16/16 в 23:59:16, Vladimir wrote:
Что-то не хватает функции поиска на форуме. Стандартное решене Гугла было бы к стати.

Я, собственно, во о чем.
Где-то проходила информация (не нашел) о том, что  долго формируется отчет в файле на диске и связяно это с постоянными открытиями-закрытиями файла, еще, возможно, притормаживает антивирус...


Возможно, Вы искали это решение:
http://hdru.com/cgi-bin/pp2/YaBB.cgi?board=errors;action=display;num=1463636010;start=5#5


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

Заголовок: Re: Быстрый вывод в файл
Прислано пользователем Vladimir на 18.12.16 в 04:48:45

on 12/17/16 в 15:08:12, Boris, Kiev. wrote:
- часто порядок вывода строк имеет место быть в результирующем файле;


Честно говоря я не понял смысла этой фразы, равно как и того, что вызвало у вас скепсис. Буферизация - стандартный прием, который используется с незапямятных времен именно для ускореня обмена данными.

По поводу скоростных тестов докладываю.
Вот эта программка выводит миллион строк в файл на диске.

FF = [dir 0]+'z-file.txt'
LF = [ch 13]+[ch 10]
T0 = [:TIMER]
[:INITFILE FF]
for i=1 to 1000000
   SS=[intsn i]+'z dwefawfa asfawf'+LF
*   printstr SS to file FF
  [: PRINTBUF FF, SS]
endfor
[:FLUSHBUF FF]
T1 = [:TIMER]
printstr 'Elapsed time: '+[:TIMEDCD T1-T0]+LF
stop

При использовании ПП буферизации время такое:
Elapsed time: 0.0.0 0:0:34

Если пользоваться printstr SS to file FF и заремить буферизацию, то время получается такое:
Elapsed time: 0.0.0 0:4:10

То есть в 8 раз медленнее.

В обоих случаях файлы получаются идентичные, размером по 24 метра.

Замеры производились на 64x сервере под W7, Intel i7, хард SSD. Полагаю, что на крутящемся диске выигрыш будет еще заметнее.

Ну и последнее. Чтобы произвести замеры времени, пришлось изобрести ПП [:TIMER] и [:TIMEDCD] о котороых напишу в другой веточке.



Powered by YaBB 1 Gold - SP 1.3.2!
Forum software copyright й 2000-2004 Yet another Bulletin Board