|
||
Заголовок: Быстрый вывод в файл Прислано пользователем 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 |