Author Topic: Чтение файла txt больше 100 метров, как ускорить процесс ?  (Read 3099 times)

0 Members and 1 Guest are viewing this topic.

stadon

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Всем доброго времени суток Уважаемые!

Написал скрипт, ну точнее собрал по частям с того что нашел на форуме, так как не особо соображаю в алгоритмах (
Проблема в том что файлы txt в среднем от 80 до 100 метров, и весь этот процесс очень туго идет, хотя тестировал на файлах до 2-3 метров - все летит как ракета )

Подскажите пожалуйста как можно это все безобразие оптимизировать и ускорить ?
Или как вариант чтение txt файлов с определенной папки по очереди (add.txt, add2.txt, ... add100.txt) к примеру.

Получилось вот что:

Code: (clickermann) [Select]
FOR ($a=0, $a<1)    // 1 кусок цикла
   
   WAITMS(10)
   LCLICK(1011,360)
   
END_CYC

LCLICK(344,705)

FOR ($i=0, $i<150) // 2 кусок
   
   INC ($num,1)    // нарастающая переменная, строка +1
   
   IF($num > TFCOUNT ("add.txt"))     // файл со строками
   HALT        // конец скрипта
   END_IF
   
   $b = TFREAD ("add.txt", $num)
   //TFDELETE("add.txt", 1)  - неактуально, очень замедляет процесс
   
   INC($e,1)  // нарастающая переменная, считает количество строк в логе
   
   TOCLIP(strconcat("Привет ",$b))
   
   KEYDOWN (#CTRL)
   KEYDOWN (#V)
   KEYUP (#V)
   KEYUP (#CTRL)
   
   KEYPRESS(#ENTER)
   WAITMS(5)
   
   LOGWRITE ($e)     // лог
   
END_CYC

Спасибо за Ваше внимание, буду очень благодарен за помощь!

ya12

  • Активный участник
  • ***
  • Posts: 165
    • View Profile
Большие файлы с SSD быстрее читаются или с виртуального диска в оперативной памяти

stadon

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Большие файлы с SSD быстрее читаются или с виртуального диска в оперативной памяти

Если я правильно понял вопрос, то файлы читаются с SSD (на вооружении имеется 2 SSD по 1.5 ТБ), потому что я далек от "Виртуального диска в оперативной памяти", - даже не представляю как это реализовать (

ya12

  • Активный участник
  • ***
  • Posts: 165
    • View Profile
https://yadi.sk/d/twaOcrnqrgPyGw
SoftPerfect RAM Disk
 
Этой программой можно сделать виртуальный диск в оперативной памяти. Выглядит, как обычный диск с буквой, главное что бы оперативной памяти хватил.


stadon

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
https://yadi.sk/d/twaOcrnqrgPyGw
SoftPerfect RAM Disk
 
Этой программой можно сделать виртуальный диск в оперативной памяти. Выглядит, как обычный диск с буквой, главное что бы оперативной памяти хватил.



Установил, выделил 200 мб, скинул скрипт и файл, но что-то не очень улучшило ситуацию (

Подскажите пожалуйста реализацию с чтением файлов из папки по очереди, если это возможно.

4.У.В.@.К

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
В коде скрипта можно сделать пару оптимизаций:
1. Количество строк в файле проверять 1 раз, а не перед каждым чтением строки из файла. Для больших файлов это критично.
2. Вывод в лог сделать в отдельном потоке, с увеличенным интервалом. Посмотреть сколько строк из файла обработал скрипт, можно раз в несколько секунд, а не на каждой итерации цикла. Вывод в лог съедает много времени.

Вот так будет работать раза в 2 быстрее:
Code: (clickermann) [Select]
FOR ($a=0, $a<1)    // 1 кусок цикла
   
   WAITMS(10)
   LCLICK(1011,360)
   
END_CYC

LCLICK(344,705)

$count = TFCOUNT("add.txt") + 1 // количество строк в файле

FOR ($i = 1, (($i < 150) & ($i < $count))) // 2 кусок
   
   $b = TFREAD("add.txt", $i)
   
   TOCLIP(STRCONCAT("Привет ", $b))
   
   KEYDOWN(#CTRL)
   KEYPRESS(#V)
   KEYUP(#CTRL)
   
   KEYPRESS(#ENTER)
   WAITMS(5)
   
END_CYC

THREAD(name, 1)
   WAIT(3) // частота вывода в лог
   // LOGCLEAR // чтобы лог не разрастался
   LOGWRITE ($i) // лог
END_THREAD

HALT

4.У.В.@.К

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Подскажите пожалуйста реализацию с чтением файлов из папки по очереди, если это возможно.

Вот как то так. Не проверял, должно работать, только путь к файлам свой указать надо.
Code: (clickermann) [Select]
STRSEPARATE("add;add2;add3;add4;add5", ";", $arr) // список имен файлов в массив

FOR($n = 0, $n < ARRSIZE($arr))
   
   $file = STRCONCAT($arr[$n], ".txt") // путь к файлу (полный или относительный)
   
   FOR ($a=0, $a<1)    // 1 кусок цикла
     
      WAITMS(10)
      LCLICK(1011,360)
     
   END_CYC
   
   LCLICK(344,705)
   
   $count = TFCOUNT($file) + 1 // количество строк в файле
   
   FOR ($i = 1, (($i < 150) & ($i < $count))) // 2 кусок
     
      $b = TFREAD($file, $i)
     
      TOCLIP(STRCONCAT("Привет ", $b))
     
      KEYDOWN(#CTRL)
      KEYPRESS(#V)
      KEYUP(#CTRL)
     
      KEYPRESS(#ENTER)
      WAITMS(5)
     
   END_CYC
   
END_CYC

THREAD(name, 1)
   WAIT(3) // частота вывода в лог
   // LOGCLEAR // чтобы лог не разрастался
   LOGWRITE (STRCONCAT("Файл: ", $arr[$n], ".txt", " | Строка: ", $i)) // вывод в лог
END_THREAD

HALT
« Last Edit: July 30, 2020, 11:51:56 PM by 4.У.В.@.К »

4.У.В.@.К

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
А еще лучше будет, если лог обновлять не по времени, а по требованию.

Code: (clickermann) [Select]
STRSEPARATE("add;add2;add3;add4;add5", ";", $arr) // список имен файлов в массив

FOR($n = 0, $n < ARRSIZE($arr))
   
   $file = STRCONCAT($arr[$n], ".txt") // путь к файлу (полный или относительный)
   
   FOR ($a=0, $a<1)    // 1 кусок цикла
     
      WAITMS(10)
      LCLICK(1011,360)
     
   END_CYC
   
   LCLICK(344,705)
   
   $count = TFCOUNT($file) + 1 // количество строк в файле
   
   FOR ($i = 1, (($i < 150) & ($i < $count))) // 2 кусок
     
      $b = TFREAD($file, $i)
     
      TOCLIP(STRCONCAT("Привет ", $b))
     
      KEYDOWN(#CTRL)
      KEYPRESS(#V)
      KEYUP(#CTRL)
     
      KEYPRESS(#ENTER)
      WAITMS(5)
     
   END_CYC
   
END_CYC

SETTHREAD (log, 0) // когда все файлы обработаны - остановить поток "log"
//
LOGWRITE (STRCONCAT("Файл: ", $arr[$n], ".txt", " | Строка: ", $i)) // вывод в лог последней статистики

HALT

THREAD(log, 1)
   WAIT(3) // ожидание обновления лога
   WHILE(ISKEYDOWN(#F4)) // если нажата клавиша F4 - лог будет обновляться
      // LOGCLEAR // чтобы лог не разрастался
      LOGWRITE (STRCONCAT("Файл: ", $arr[$n], ".txt", " | Строка: ", $i)) // вывод в лог
      WAIT(1) // частота обновления лога
   END_CYC
END_THREAD

Можно еще добавить возможность сохранения прогресса выполнения сценария в файл. Чтобы при необходимости, можно было выключить кликер и при следующем запуске он продолжил свою работу с того места, на котором его прервали. И временную приостановку сценария тоже можно сделать.
Всё это конечно скорости не прибавит, зато даст возможность завершить очень длительный по времени выполнения сценарий.
« Last Edit: July 31, 2020, 10:54:04 AM by 4.У.В.@.К »

stadon

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
А еще лучше будет, если лог обновлять не по времени, а по требованию.

Code: (clickermann) [Select]
STRSEPARATE("add;add2;add3;add4;add5", ";", $arr) // список имен файлов в массив

FOR($n = 0, $n < ARRSIZE($arr))
   
   $file = STRCONCAT($arr[$n], ".txt") // путь к файлу (полный или относительный)
   
   FOR ($a=0, $a<1)    // 1 кусок цикла
     
      WAITMS(10)
      LCLICK(1011,360)
     
   END_CYC
   
   LCLICK(344,705)
   
   $count = TFCOUNT($file) + 1 // количество строк в файле
   
   FOR ($i = 1, (($i < 150) & ($i < $count))) // 2 кусок
     
      $b = TFREAD($file, $i)
     
      TOCLIP(STRCONCAT("Привет ", $b))
     
      KEYDOWN(#CTRL)
      KEYPRESS(#V)
      KEYUP(#CTRL)
     
      KEYPRESS(#ENTER)
      WAITMS(5)
     
   END_CYC
   
END_CYC

SETTHREAD (log, 0) // когда все файлы обработаны - остановить поток "log"
//
LOGWRITE (STRCONCAT("Файл: ", $arr[$n], ".txt", " | Строка: ", $i)) // вывод в лог последней статистики

HALT

THREAD(log, 1)
   WAIT(3) // ожидание обновления лога
   WHILE(ISKEYDOWN(#F4)) // если нажата клавиша F4 - лог будет обновляться
      // LOGCLEAR // чтобы лог не разрастался
      LOGWRITE (STRCONCAT("Файл: ", $arr[$n], ".txt", " | Строка: ", $i)) // вывод в лог
      WAIT(1) // частота обновления лога
   END_CYC
END_THREAD

Спасибо большое Вам за помощь!

1 вариант более мне понятен, но работает немного медленнее чем 2 вариант, единственное что счетчик слетает после выхода из 2 куска скрипта после выполнения $i < 150 (и в 1 скрипте и во 2)... Как это можно исправить ? - что бы постоянно считало, мне это нужно что бы не использовать TFDELETE, я потом сам руками открываю и удаляю пройденные строки, так как иногда скрипт может часов 10 работать, а иногда жена говорит поехали в магазин и я все останавливаю через 30 минут )))

3 скрипт заканчивается ошибкой, добавил 2 вложения (скрины)


4.У.В.@.К

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Чтобы небыло ошибки, надо в строке
STRSEPARATE("add;add2;add3;add4;add5", ";", $arr) // список имен файлов в массив
оставить только имена существующих файлов, остальные удалить (вместе с разделителями).

И значит нужно вернуть на место нарастающую переменную:
INC ($num,1)   // нарастающая переменная, строка +1
или
INC($e,1)  // нарастающая переменная, считает количество строк в логе
И соответственно, вывести её в лог.

« Last Edit: July 31, 2020, 01:12:03 PM by 4.У.В.@.К »

4.У.В.@.К

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
так как иногда скрипт может часов 10 работать, а иногда жена говорит поехали в магазин и я все останавливаю через 30 минут )))

Видимо сохранение все же нужно будет сделать.

Можно еще добавить возможность сохранения прогресса выполнения сценария в файл. Чтобы при необходимости, можно было выключить кликер и при следующем запуске он продолжил свою работу с того места, на котором его прервали. И временную приостановку сценария тоже можно сделать.
Всё это конечно скорости не прибавит, зато даст возможность завершить очень длительный по времени выполнения сценарий.

Только сейчас не смогу, работа мешает.((

stadon

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Чтобы небыло ошибки, надо в строке
STRSEPARATE("add;add2;add3;add4;add5", ";", $arr) // список имен файлов в массив
оставить только имена существующих файлов, остальные удалить (вместе с разделителями).

И значит нужно вернуть на место нарастающую переменную:
INC ($num,1)   // нарастающая переменная, строка +1
или
INC($e,1)  // нарастающая переменная, считает количество строк в логе
И соответственно, вывести её в лог.



Сидел смотрел на код... Чет ничего не получается реализовать ((

Нашел программку которая режет txt на количество строк, разрезал на файлы по 5 мб, - их быстрее Clickermann переваривает )

Могу Вас попросить, прикрутить нарастающую переменную которая будет считать строки до конца перебора всех файлов, к скрипту с масивами (он быстрее работает)

Code: (clickermann) [Select]
STRSEPARATE("add;add2;add3;add4;add5", ";", $arr) // список имен файлов в массив
 
FOR($n = 0, $n < ARRSIZE($arr))
 
   $file = STRCONCAT($arr[$n], ".txt") // путь к файлу (полный или относительный)
 
   FOR ($a=0, $a<1)    // 1 кусок цикла
 
      WAITMS(10)
      LCLICK(1011,360)
 
   END_CYC
 
   LCLICK(344,705)
 
   $count = TFCOUNT($file) + 1 // количество строк в файле
 
   FOR ($i = 1, (($i < 150) & ($i < $count))) // 2 кусок
 
      $b = TFREAD($file, $i)
 
      TOCLIP(STRCONCAT("Привет ", $b))
 
      KEYDOWN(#CTRL)
      KEYPRESS(#V)
      KEYUP(#CTRL)
 
      KEYPRESS(#ENTER)
      WAITMS(5)
 
   END_CYC
 
END_CYC
 
THREAD(name, 1)
   WAIT(3) // частота вывода в лог
   // LOGCLEAR // чтобы лог не разрастался
   LOGWRITE (STRCONCAT("Файл: ", $arr[$n], ".txt", " | Строка: ", $i)) // вывод в лог
END_THREAD
 
HALT


4.У.В.@.К

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Code: (clickermann) [Select]
GETFILELIST($arr, "C:\papka\*.txt") // список всех *.txt файлов в папке "C:\papka\"

FOR($n = 0, $n < ARRSIZE($arr))
   
   $file = $arr[$n]
   
   FOR ($a=0, $a<1)    // 1 кусок цикла
     
      WAITMS(10)
      LCLICK(1011,360)
     
   END_CYC
   
   LCLICK(344,705)
   
   $count = TFCOUNT($file) + 1 // количество строк в файле
   
   FOR ($i = 1, (($i < 150) & ($i < $count))) // 2 кусок
     
      $b = TFREAD($file, $i)
     
      TOCLIP(STRCONCAT("Привет ", $b))
     
      KEYDOWN(#CTRL)
      KEYPRESS(#V)
      KEYUP(#CTRL)
     
      KEYPRESS(#ENTER)
      WAITMS(5)
     
      INC($num) // количество обработанных строк
     
   END_CYC
   
   // INC($num,$i) // количество обработанных строк, по окончании обработки фала
   
END_CYC

SETTHREAD (log, 0) // когда все файлы обработаны - остановить поток "log"
LOGWRITE ("Всего бработано строк: ", $num) // вывод в лог последней статистики

THREAD(name, 1)
   WAIT(1) // частота вывода в лог
   LOGCLEAR // чтобы лог не разрастался
   LOGWRITE ("В обработке файл: ", $file) // вывод в лог
   LOGWRITE ("Обработано строк: ", $num)
END_THREAD

HALT

Скрипт просканирует папку на наличие txt-фалов и будет обрабатывать их по порядку.
Количество обработанных строк стакается в переменную $num, в строке 31. Можно эту строку закомментировать и активировать строку 35. Но одна из них должна быть закомментирована, или удалена. Когда работает строка 35, экономия времени больше.
В 1 строке скрипта нужно прописать свой путь к папке с txt-фалами (полный или относительный), отмечено красным.
GETFILELIST($arr, "C:\papka\*.txt") // список всех *.txt файлов в папке "C:\papka\"
Вроде всё)

stadon

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Code: (clickermann) [Select]
GETFILELIST($arr, "C:\papka\*.txt") // список всех *.txt файлов в папке "C:\papka\"

FOR($n = 0, $n < ARRSIZE($arr))
   
   $file = $arr[$n]
   
   FOR ($a=0, $a<1)    // 1 кусок цикла
     
      WAITMS(10)
      LCLICK(1011,360)
     
   END_CYC
   
   LCLICK(344,705)
   
   $count = TFCOUNT($file) + 1 // количество строк в файле
   
   FOR ($i = 1, (($i < 150) & ($i < $count))) // 2 кусок
     
      $b = TFREAD($file, $i)
     
      TOCLIP(STRCONCAT("Привет ", $b))
     
      KEYDOWN(#CTRL)
      KEYPRESS(#V)
      KEYUP(#CTRL)
     
      KEYPRESS(#ENTER)
      WAITMS(5)
     
      INC($num) // количество обработанных строк
     
   END_CYC
   
   // INC($num,$i) // количество обработанных строк, по окончании обработки фала
   
END_CYC

SETTHREAD (log, 0) // когда все файлы обработаны - остановить поток "log"
LOGWRITE ("Всего бработано строк: ", $num) // вывод в лог последней статистики

THREAD(name, 1)
   WAIT(1) // частота вывода в лог
   LOGCLEAR // чтобы лог не разрастался
   LOGWRITE ("В обработке файл: ", $file) // вывод в лог
   LOGWRITE ("Обработано строк: ", $num)
END_THREAD

HALT

Скрипт просканирует папку на наличие txt-фалов и будет обрабатывать их по порядку.
Количество обработанных строк стакается в переменную $num, в строке 31. Можно эту строку закомментировать и активировать строку 35. Но одна из них должна быть закомментирована, или удалена. Когда работает строка 35, экономия времени больше.
В 1 строке скрипта нужно прописать свой путь к папке с txt-фалами (полный или относительный), отмечено красным.
GETFILELIST($arr, "C:\papka\*.txt") // список всех *.txt файлов в папке "C:\papka\"
Вроде всё)

Спасибо большое добрый человек! :)
Все работает как ракета, потестил оба варианта, просто пушка )
Удачи и добра! 8)

stadon

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Code: (clickermann) [Select]
GETFILELIST($arr, "C:\papka\*.txt") // список всех *.txt файлов в папке "C:\papka\"

FOR($n = 0, $n < ARRSIZE($arr))
   
   $file = $arr[$n]
   
   FOR ($a=0, $a<1)    // 1 кусок цикла
     
      WAITMS(10)
      LCLICK(1011,360)
     
   END_CYC
   
   LCLICK(344,705)
   
   $count = TFCOUNT($file) + 1 // количество строк в файле
   
   FOR ($i = 1, (($i < 150) & ($i < $count))) // 2 кусок
     
      $b = TFREAD($file, $i)
     
      TOCLIP(STRCONCAT("Привет ", $b))
     
      KEYDOWN(#CTRL)
      KEYPRESS(#V)
      KEYUP(#CTRL)
     
      KEYPRESS(#ENTER)
      WAITMS(5)
     
      INC($num) // количество обработанных строк
     
   END_CYC
   
   // INC($num,$i) // количество обработанных строк, по окончании обработки фала
   
END_CYC

SETTHREAD (log, 0) // когда все файлы обработаны - остановить поток "log"
LOGWRITE ("Всего бработано строк: ", $num) // вывод в лог последней статистики

THREAD(name, 1)
   WAIT(1) // частота вывода в лог
   LOGCLEAR // чтобы лог не разрастался
   LOGWRITE ("В обработке файл: ", $file) // вывод в лог
   LOGWRITE ("Обработано строк: ", $num)
END_THREAD

HALT

Скрипт просканирует папку на наличие txt-фалов и будет обрабатывать их по порядку.
Количество обработанных строк стакается в переменную $num, в строке 31. Можно эту строку закомментировать и активировать строку 35. Но одна из них должна быть закомментирована, или удалена. Когда работает строка 35, экономия времени больше.
В 1 строке скрипта нужно прописать свой путь к папке с txt-фалами (полный или относительный), отмечено красным.
GETFILELIST($arr, "C:\papka\*.txt") // список всех *.txt файлов в папке "C:\papka\"
Вроде всё)

Спасибо большое добрый человек! :)
Все работает как ракета, потестил оба варианта, просто пушка )
Удачи и добра! 8)

Что то пошло не так ( :'(
Сегодня выходной ... Немного присмотрелся, увидел что то-то не так, решил закинуть в папку буфера (GETFILELIST($arr, "C:\papka\*.txt")) 2 txt файла на 500 и 2000 строк. Запустил скрипт и понял что он не остановился на "количество обработаных строк 2600+ ", понял что он читает рандомом файлы и строки (

Как сделать что бы он работал по порядку начиная с 1.txt +1... 10.txt и так же шел по строкам в каждом файле ? Или даже просто после прочтения файла удалял его?
Если возможно реализовать удаления файлов после прочтения, считать строки уже тогда будет не актуально.

Спасибо за помощь!