Автор |
Тема: Быстрый вывод в файл (Прочитано 30617 раз) |
|
Vladimir
Я люблю этот Форум!
Просмотреть Профиль | WWW |
Сообщений: 264
|
Что-то не хватает функции поиска на форуме. Стандартное решене Гугла было бы к стати. Я, собственно, во о чем. Где-то проходила информация (не нашел) о том, что долго формируется отчет в файле на диске и связяно это с постоянными открытиями-закрытиями файла, еще, возможно, притормаживает антивирус... У меня есть отчет, который занимет 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 *
|
« Изменён в : 17.12.16 в 03:00:32 пользователем: Vladimir » |
Зарегистрирован |
С уважением, Владимир
|
|
|
Boris, Kiev.
Адепт ФБП с 1996г.
Просмотреть Профиль | E-мэйл
Сообщений: 875
|
on 16.12.16 в 23:59:16, Vladimir wrote:Что-то не хватает функции поиска на форуме. Стандартное решене Гугла было бы к стати. Я, собственно, во о чем. Где-то проходила информация (не нашел) о том, что долго формируется отчет в файле на диске и связяно это с постоянными открытиями-закрытиями файла, еще, возможно, притормаживает антивирус... |
| Возможно, Вы искали это решение: http://hdru.com/cgi-bin/pp2/YaBB.cgi?board=errors;action=display;num=146 3636010;start=5#5 По поводу вашего способа - есть скепсис, т.к.: - часто порядок вывода строк имеет место быть в результирующем файле; - не хватает публикации замеров времени на задачу "без" и "с" этим алгоритмом.
|
|
Зарегистрирован |
|
|
|
Vladimir
Я люблю этот Форум!
Просмотреть Профиль | WWW |
Сообщений: 264
|
on 17.12.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] о котороых напишу в другой веточке.
|
« Изменён в : 19.12.16 в 03:26:24 пользователем: Vladimir » |
Зарегистрирован |
С уважением, Владимир
|
|
|
|
|