Автокликер Clickermann :: Форум

Основной раздел => Общие вопросы => Topic started by: putman on January 20, 2014, 05:41:17 PM

Title: Ускорение работы с файлом.
Post by: putman on January 20, 2014, 05:41:17 PM
И снова здравствуйте.
Моя программка на Мой мир, что на майл.ру, заходит в анкету, ставит "Нравится" и пишет в файл урл этой страницы, что бы повторно не заходить.
За 2 дня уже более 3000 анкет в файле, работа заметно замедлилась, т.к. перед входом в анкету в цикле файл открывается 3000 раз и проверяется очередная строка на повторение.
Хочу узнать, возможно сразу все строки из файла считать в массив, или переменную далее разделив (тут уже ограничение по длине переменной наверное не даст).
В памяти же писать допустим 50 страниц и скопом писать в файл, тем самым снизив число обращений к диску.
Диск у меня флешевый, думал будет быстро работать, но уже около секунды тратит на 3000 чтений. А когда будет 30 000 ...
Что посоветуете ?
Спасибо.
Title: Re: Ускорение работы с файлом.
Post by: Oraven on January 20, 2014, 06:56:17 PM
Быстрее вряд ли выйдет

Вот считывание всех строк в массив. Это для 4.9 версии. Для 4.8 в место $n+1 надо писать $n
Code: (clickermann) [Select]
FOR($n,$n<TFCOUNT ("Файл.txt"))
   ARRPUSH($links, TFREAD ("Файл.txt", $n+1))
END_CYC
HALT

ограничение на строку 256 симолов. Здесь помогла бы функция поиска в файле или в массиве, еслиб она была.....
Title: Re: Ускорение работы с файлом.
Post by: putman on January 23, 2014, 07:59:36 PM
Cделал загрузку файла в массив.
Поиск идёт в массиве.
Особой разницы между сравнением каждой строки из файла не заметил.
Ощущение что массивы организованы в файлах )))
Title: Re: Ускорение работы с файлом.
Post by: Vint on January 23, 2014, 09:47:00 PM
Наверно большой массив тоже нехило замедляет. А ну ворочать его.
Может стоит искать другой подход. Например, снижать количество сравниваемых символов. Сравнивать не весь урл, а только последнюю часть - параметр строки. Обычно анкеты, аккаунты так формируются. И в файл/массив тоже писать не весь.
Можно ещё что нибудь придумать. Может там деление по датам есть. На крайний случай проверку адреса с базой переложить на внешний модуль на другом языке/программе. Да вот хотя бы Ассемблер :)
Title: Re: Ускорение работы с файлом.
Post by: putman on January 24, 2014, 05:43:30 PM
... Сравнивать не весь урл, а только последнюю часть - параметр строки. Обычно анкеты, аккаунты так формируются. И в файл/массив тоже писать не весь.
Хорошая идея, тогда подскажите как лучше удалить начало урл  ?
Маска не одна и та же, их может быть три:

http://my.mail.ru/mail/
http://my.mail.ru/bk/
http://my.mail.ru/list/

Функция STRFILTER, поудаляет не только начало урл, но и все совпадающие с ними символы в значимой части.
Как посоветуете поступить ?



Title: Re: Ускорение работы с файлом.
Post by: Vint on January 24, 2014, 06:16:33 PM
Хорошая идея, тогда подскажите как лучше удалить начало урл  ?
Маска не одна и та же, их может быть три:

http://my.mail.ru/mail/
http://my.mail.ru/bk/
http://my.mail.ru/list/

Функция STRFILTER, поудаляет не только начало урл, но и все совпадающие с ними символы в значимой части.
Как посоветуете поступить ?
Аааа... на мэйле. Боюсь не поможет, там адреса и так короткие. Но можно попробовать.
С телефона, по памяти
$url = STRCUT2($url, POS("l/")+2, POS("/")-1)
$url = STRCUT2($url, POS("k/")+2, POS("/")-1)
$url = STRCUT2($url, POS("t/")+2, POS("/")-1)

Нужно пробовать, время мерять.
Можно попробовать в начале скрипта считать не в один массив, а несколько поменьше. Или считать в несколько текстовых переменных объединив стрконкатом. Потом искать подстроку в строке.
Аж интересно. Нужно тест сделать чтобы представлять порядок цифр.
Title: Re: Ускорение работы с файлом.
Post by: putman on January 24, 2014, 07:00:42 PM
У меня 4 различных начала урл.
ДЛя начала надо узнать какой именно из них, что бы потом его отрезать.
Что то у меня такое условие только начало с майл отрезает, а остальные оставляет как были.

Code: [Select]

for($var, $var < 4)
 $varm = $var + 1
 $_ankf = TFRead("name.txt", $varm)
 
 IF STRPOS ($_ankf, "mail/") = 1   
$pos =  STRPOS($_ankf, "mail/") + 5
 END_IF
 
  IF  STRPOS($_ankf, "inbox/") = 1   
$pos =  STRPOS($_ankf, "inbox/") + 6
  END_IF
 
  IF  STRPOS($_ankf, "list/") = 1   
$pos =  STRPOS($_ankf, "list/") + 5
  END_IF
 
  IF  STRPOS($_ankf, "bk/") = 1   
$pos =  STRPOS($_ankf, "bk/") + 3
 END_IF

ps:
$_ankf = STRCUT2($_ankf, $pos, 100)

LOGWRITE ($_ankf)

END_CYC

Title: Re: Ускорение работы с файлом.
Post by: putman on January 24, 2014, 07:31:11 PM
В коде выше у меня не работают условия, каждый раз входит во все IF.
Никак не могу найти как в условии проверять истинность присутствия одной из строк - list, inbox, mail или bk.
Title: Re: Ускорение работы с файлом.
Post by: Oraven on January 24, 2014, 08:42:06 PM
Вот правильный код
Code: (clickermann) [Select]
for($var, $var < 4)
   $pos = 0
   $_ankf = TFRead("name.txt", $var+1)
   
   IF((STRPOS ($_ankf, "mail/") > 0) & ($pos = 0))
      $pos =  STRPOS($_ankf, "mail/") + 5
   END_IF
   
   IF((STRPOS($_ankf, "inbox/") > 0) & ($pos = 0))
      $pos =  STRPOS($_ankf, "inbox/") + 6
   END_IF
   
   IF((STRPOS($_ankf, "list/") > 0) & ($pos = 0))
      $pos =  STRPOS($_ankf, "list/") + 5
   END_IF
   
   IF((STRPOS($_ankf, "bk/") > 0) & ($pos = 0))
      $pos =  STRPOS($_ankf, "bk/") + 3
   END_IF

   $_ankf = STRCUT2($_ankf, $pos, 100)
   
   LOGWRITE ($_ankf)
   
END_CYC
Title: Re: Ускорение работы с файлом.
Post by: putman on January 24, 2014, 10:41:39 PM
Вот правильный код
...
Этот код отрезает одинаковое количество символов, то которое указано в первом условии, в данном случае это + 3.
На остальные условия (с разными длинами доменов) он не реагирует, какие бы цифры там не стояли.
Code: [Select]
   IF((STRPOS ($_ankf, "mail/") > 0) & ($pos = 0))
     $pos =  STRPOS($_ankf, "mail/") + 3
  END_IF
т.е. получается
Code: [Select]
23:37:13 l/goldsmetana/
23:37:13 xxx1910xxx19010/
23:37:13 ox/lagonet/
23:37:13 t/bagira19/
Title: Re: Ускорение работы с файлом.
Post by: Oraven on January 25, 2014, 01:42:59 AM
Сделал файл "name.txt". Записал туда такие строки
Code: [Select]
http://my.mail.ru/mail/goldsmetana/
http://my.mail.ru/bk/xxx1910xxx19010/
http://my.mail.ru/list/lagonet/
http://my.mail.ru/inbox/bagira19/

Поместил рядом скрипт, запустил и в логе получил:
Code: [Select]
2:40:39 goldsmetana/
2:40:39 xxx1910xxx19010/
2:40:39 lagonet/
2:40:39 bagira19/

Что у тебя не так?
Title: Re: Ускорение работы с файлом.
Post by: putman on January 26, 2014, 06:26:38 PM
Большое спасибо !
Ваш код работает, не знаю, что я не так скопировал в первый раз. Скопировал снова, вставил, работает.
Title: Re: Ускорение работы с файлом.
Post by: Vint on January 28, 2014, 02:58:22 PM
Самому стало интересно. Сделал ряд опытов. Забыл выложить, исправляюсь.

Создал генератором 2 файла в одном полные адреса, во втором только значимая часть.

Первые два теста не работа с файлом, а вырезание короткой части.
Тест 1 - вариант Андрея
Тест 2 -  вложенными условиями
Искать буду существующий адрес (для контроля) записанный последним для равного числа переборов.
Тестовый файл взял на 1000 адресов.
Результаты привожу для компа с работы, довольно тормознутого. Чем быстрее комп тем меньше разница в результатах.

результат 47 и 22 мс соответственно
В принципе эта часть вызывается всего 1 раз при каждом поиске, поэтому сильно не влияет. Но всё-таки.


Тест 3 - прямым перебором строк напрямую сравниваем длинные адреса с длинным образцом
Тест 4 - то же, для коротких адресов
Тест 5 - не удался из-за ограничения длины переменной в 4.8, пришлось пропустить
Тест 6 - короткие адреса, через массив. Считываем файл 1 раз, далее работаем с массивом параллельно дописывая в файл новые данные.
Тест 7 - сделал поиск в файле в AutoIt, параметры передавал/принимал через ini. Учтено время, в т.ч на вызов exe.


Результаты:

13:59:27 Время теста
13:59:27 Тест 1   47 мс
13:59:27 Тест 2   22 мс
13:59:27 
13:59:27 Тест 3.   Длинные 1337 мс
13:59:27 Тест 4.   Короткие 1108 мс
13:59:27 Тест 6.   Короткие в массив 522 мс
13:59:27 Тест 7.   Короткие. Вызов AutoIt 111 мс

Выводы:
короткие адреса дают выигрыш против длинных -17%, смысл есть.
массивы против прямого перебора из файла дают выигрыш -52%, смысл есть.Не знаю, почему у тебя получилось одинаково.
через вызов сторонней скомпилированной программы (знал бы С++ сделал бы на нём) против массивов -78%, против коротких прямых -90%

Если нигде не накосячил...
Все файлы во вложении.
Само собой от запуска к запуску результаты чуть разнятся.

Массивы это хорошо. В чистом кликере нужно через них.
Автоит не рекламирую. Кстати в обычном, не скомпилированном скрипте результаты точь в точь совпадают с результатами на массивах в кликере. Это толстый намёк на необходимую не только для закрытости компиляцию...  :)

Можно ещё ускорить, разделив хранящиеся данные по 4 файлам в зависимости от домена. mail, bk, inbox, list. И искать каждый только в своём домене.
Предполагаю, что в домене mail адресов гораздо больше, чем в других. Нужно сделать анализ, подсчитать реальные адреса. И если mail = bk+inbox+list можно делить на 2 файла.
Если конечно предполагается большая база, то лучше на 4. Я бы выжимал скорость сразу всеми способами, даже дающими незначительное ускорение.

Code: (clickermann) [Select]
#name "Работа с файлом"
// Author: Vint
// Version: 1.1 (28.01.2014)
// Для 4.9 (003)


//==============================================================================
SUB (itog)    //  вывод затраченного времени
   $test_time = $_ms-$start
   LOGWRITE ("Время теста. Вариант ", $v1, "   ", $test_time, " мс")
   LOGWRITE (" ")
   LOGWRITE ("-------------------------------------------------")
END_SUB

//==============================================================================

LOGCLEAR


// тест 1 вариант 1  длинный адрес
$start = $_ms
$v1 = 1
for($var, $var < 10)
   $pos = 0
   $_ankf = TFRead("name.txt", $var+1)
   
   IF((STRPOS ($_ankf, "mail/") > 0) & ($pos = 0))
      $pos =  STRPOS($_ankf, "mail/") + 5
   END_IF
   
   IF((STRPOS($_ankf, "inbox/") > 0) & ($pos = 0))
      $pos =  STRPOS($_ankf, "inbox/") + 6
   END_IF
   
   IF((STRPOS($_ankf, "list/") > 0) & ($pos = 0))
      $pos =  STRPOS($_ankf, "list/") + 5
   END_IF
   
   IF((STRPOS($_ankf, "bk/") > 0) & ($pos = 0))
      $pos =  STRPOS($_ankf, "bk/") + 3
   END_IF
   
   $_ankf = STRCUT2($_ankf, $pos, 100)
   //LOGWRITE ($_ankf)
END_CYC
itog()
$test_time1 = $test_time


// тест 2 вариант 2  короткий адрес
UNDEFINE($url)
$start = $_ms
$v1 = 2
for($var, $var < 10)
   $url = TFRead("name.txt", $var+1)
   IF(STRPOS ($url, "mail/") > 0)
      $url = STRCUT2($url, STRPOS($url, "mail/")+5, 100)
   ELSE
      IF(STRPOS ($url, "inbox/") > 0)
         $url = STRCUT2($url, STRPOS($url, "inbox/")+6, 100)
      ELSE
         IF(STRPOS ($url, "list/") > 0)
            $url = STRCUT2($url, STRPOS($url, "list/")+5, 100)
         ELSE
            IF(STRPOS ($url, "bk/") > 0)
               $url = STRCUT2($url, STRPOS($url, "bk/")+3, 100)
            END_IF
         END_IF
      END_IF
   END_IF
   $url = STRCUT2($url, 1, STRPOS($url, "/")-1)
   
   //LOGWRITE ($url)
END_CYC
itog()
$test_time2 = $test_time


// тест 3  прямое сравнение длинных
UNDEFINE($url)
$ank = "http://my.mail.ru/mail/aicauro/"
$start = $_ms
$v1 = 3
for ($i, $i<TFCOUNT("name.txt"))
   $url = TFRead("name.txt", $i+1)
   IF($ank = $url)
      LOGWRITE ("Имя есть в базе")
   END_IF
end_cyc
itog()
$test_time3 = $test_time


// тест 4   прямое сравнение коротких
UNDEFINE($url)
$ank = "aicauro"
$start = $_ms
$v1 = 4
for ($i, $i<TFCOUNT("name_small.txt"))
   $url = TFRead("name_small.txt", $i+1)
   IF($ank = $url)
      LOGWRITE ("Имя есть в базе")
   END_IF
end_cyc
itog()
$test_time4 = $test_time


// тест 5   короткие в строку
//UNDEFINE($url)
//$ank = "aicauro"
//$url = ""
//$v1 = 5
//for ($i, $i<TFCOUNT("name_small.txt"))
//   $url = STRCONCAT($url, TFRead("name_small.txt", $i))
//end_cyc
//LOGWRITE ("$url = ", $url)
//LOGWRITE ("Len ", STRLEN($url))



//$start = $_ms
//IF(STRPOS($url, $ank) > 0)
//   LOGWRITE ("Имя есть в базе")
//ELSE
//   //LOGWRITE ("Имени нет в базе")
//END_IF
//$url = STRCONCAT($url, $ank)
//GOSUB(itog)
//$test_time5 = $test_time


// тест 6   короткие в массив
UNDEFINE($url)
$ank = "aicauro"
$url = ""
$v1 = 6
for ($i, $i<TFCOUNT("name_small.txt"))
   $data = TFRead("name_small.txt", $i+1)
   ARRPUSH($url, $data)
end_cyc
//LOGWRITE ("ARRSIZE = ", ARRSIZE($url2))

$start = $_ms
for ($i, $i < ARRSIZE($url))
   IF($ank = $url[$i])
      LOGWRITE ("Имя есть в базе")
   END_IF
end_cyc
$url = ARRPUSH($url, $ank)
itog()
$test_time6 = $test_time


// тест 7   вызов AutoIt
UNDEFINE($url)
$ank = "aicauro"
$url = ""
$v1 = 7
INIWRITE("name.ini","file","name_small.txt")
$start = $_ms
INIWRITE("name.ini","ank",$ank)
INIWRITE("name.ini","return","-1")
EXECUTE("Find file.exe")
WHILE(INT(INIREAD("name.ini", "return")) = -1) // ожидание
   WAITMS(30)
   //LOGWRITE ("Ждём")
END_CYC
IF(INT(INIREAD("name.ini", "return")) = 1)
   LOGWRITE ("Имя есть в базе")
END_IF
itog()
$test_time7 = $test_time

WAIT(1)
LOGWRITE (" ")
LOGWRITE ("Время теста")
LOGWRITE ("Тест 1 ", $test_time1, " мс")
LOGWRITE ("Тест 2 ", $test_time2, " мс")
LOGWRITE (" ")
LOGWRITE ("Тест 3. Длинные ", $test_time3, " мс")
LOGWRITE ("Тест 4. Короткие ", $test_time4, " мс")
//LOGWRITE ("Тест 5. Короткие в строку ", $test_time5, " мс")
LOGWRITE ("Тест 6. Короткие в массив ", $test_time6, " мс")
LOGWRITE ("Тест 7. Короткие. Вызов AutoIt ", $test_time7, " мс")
HALT
Title: Re: Ускорение работы с файлом.
Post by: putman on January 28, 2014, 07:57:36 PM
Vint, спасибо, буду изучать код.
Сравнение сторонней быстрой программой очень интересно.
Еще я хотел в каждый элемент массива писать не одно значение, а например 20, длиной по 12 символов допустим, мне кажется будет быстрее, надо проверить.
Title: Re: Ускорение работы с файлом.
Post by: putman on January 28, 2014, 08:04:34 PM
C find file отлично получается, подскажите, где почитать про работу с внешними программами поиска.
А то, ничего не понял в той части программы, где эта работа реализована.
У меня получилось:

Quote
21:05:23 Время теста
21:05:23 Тест 1 32 мс
21:05:23 Тест 2 15 мс
21:05:23 
21:05:23 Тест 3. Длинные 1270 мс
21:05:23 Тест 4. Короткие 1227 мс
21:05:23 Тест 6. Короткие в массив 874 мс
21:05:23 Тест 7. Короткие. Вызов AutoIt 50 мс

, вот повторный тест.

Quote
21:08:07 Время теста
21:08:07 Тест 1 55 мс
21:08:07 Тест 2 12 мс
21:08:07 
21:08:07 Тест 3. Длинные 850 мс
21:08:07 Тест 4. Короткие 772 мс
21:08:07 Тест 6. Короткие в массив 444 мс
21:08:07 Тест 7. Короткие. Вызов AutoIt 55 мс

Почему такой большой разброс интересно ?
Title: Re: Ускорение работы с файлом.
Post by: putman on February 01, 2014, 10:38:45 AM
Вставил код с поиском Finf file.exe.
У меня сейчас 8500 строк в файле, поиск происходит за разное время (от 26 до 50 мсек), задержку в ожидании ответа от программы Finf file.exe убрал вообще (строка 166).
С файлом длиной 1000 строк, время было примерно такое же, видимо максимум в этом ожидании это скорость работы с диском, т.е. чтение, а сам поиск реализован на ассемблере и длится ничтожно малое время.
Большое Вам спасибо, с такой скоростью поиска можно и 100 000 строк думаю без проблем переваривать.
Title: Re: Ускорение работы с файлом.
Post by: Vint on February 01, 2014, 07:56:57 PM
Про ассемблер это была шутка. К дальнейшему коду отношения не имеет.
Что-то очень мало времени у тебя занимает. Оно хоть работает? Может ошибся где? Проверял?
Title: Re: Ускорение работы с файлом.
Post by: ЦИТРИН on February 01, 2014, 09:34:56 PM
Вставил код с поиском Finf file.exe.

Большое Вам спасибо, с такой скоростью поиска можно и 100 000 строк думаю без проблем переваривать.
Подожди )
 У меня похожая задача в твиттере.
 Решил конечно, но задержка великовата.
 Напиши пожалуйста  сюда
 1) Что за программа? Где брал программу ?
 2) Выложи  свой  скрипт.
Title: Re: Ускорение работы с файлом.
Post by: putman on February 01, 2014, 10:03:44 PM
Про ассемблер это была штука. К дальнейшему коду отношения не имеет.
Что-то очень мало времени у тебя занимает. Оно хоть работает? Может ошибся где? Проверял?
Я только комп купил, новый. Жесткий диск флешёвый 120 ГБ, там Кликерман установлен, видимо из-за этого так быстро.
Ну и проц i7, 3.5 Ггц.
Вот кусок кода где идёт поиск:
Quote
UNDEFINE($url)

$url = ""
$ank = $_ankw
INIWRITE("name.ini","file","name_small.txt")
INIWRITE("name.ini","ank",$ank)
INIWRITE("name.ini","return","-1")
$start = $_ms
EXECUTE("Find file.exe")
WHILE(INT(INIREAD("name.ini", "return")) = -1)   // ????????
   //WAITMS(30)
   //LOGWRITE ("Æä¸ì")
END_CYC
$start = $_ms - $start
IF(INT(INIREAD("name.ini", "return")) = 1)
   LOGWRITE ("Èìÿ åñòü â áàçå")
   
       $_kank =  $_kank + 15
       $_bzank = $_bzank + 1
      GOTO (st)
END_IF

Title: Re: Ускорение работы с файлом.
Post by: putman on February 01, 2014, 10:05:13 PM
Вставил код с поиском Finf file.exe.

Большое Вам спасибо, с такой скоростью поиска можно и 100 000 строк думаю без проблем переваривать.
Подожди )
 У меня похожая задача в твиттере.
 Решил конечно, но задержка великовата.
 Напиши пожалуйста  сюда
 1) Что за программа? Где брал программу ?
 2) Выложи  свой  скрипт.

Скрипт обращения к программе для поиска строки в предыдущем сообщении.
Программа поиска Finf file.exe, она наверное ещё в досе была, я припоминаю такую вроде.
Title: Re: Ускорение работы с файлом.
Post by: Johnny on February 02, 2014, 07:25:39 AM
ээээ кто нибудь может в двух словах объяснить суть темы.
что медленно работает?
что нужно улучшить?
Title: Re: Ускорение работы с файлом.
Post by: Oraven on February 02, 2014, 09:39:10 AM
ээээ кто нибудь может в двух словах объяснить суть темы.
что медленно работает?
что нужно улучшить?

putman собирает в файл ссылки на страницы чтобы больше к ним не возвращаться, естественно когда в файле собралось 3000 строк анализ на совпадения замедлился. В место того чтобы проверять каждую строку в файле нужна функция поиска текста сразу во всем файле.
Title: Re: Ускорение работы с файлом.
Post by: putman on February 02, 2014, 07:37:00 PM
Именно так =)
Title: Re: Ускорение работы с файлом.
Post by: Johnny on February 03, 2014, 08:07:55 AM
какая то специфическая задача...
даже если сделать такую функцию, то что она будет возвращать?

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

ну а в целом работа над оптимизацией быстродействия ведется постоянно.
Title: Re: Ускорение работы с файлом.
Post by: Oraven on February 03, 2014, 10:17:23 AM
какая то специфическая задача...
даже если сделать такую функцию, то что она будет возвращать?

Номер строки или строк конечно. Кстати возможен ли такой поиск для массивов?
Title: Re: Ускорение работы с файлом.
Post by: putman on March 04, 2014, 07:08:24 AM
Вставил код с поиском Finf file.exe.
У меня сейчас 8500 строк в файле, поиск происходит за разное время (от 26 до 50 мсек), задержку в ожидании ответа от программы Finf file.exe убрал вообще (строка 166).
Сейчас более 17000 строк, время поиска не увеличилось, хвала симбиозу Clickermann + ассемблер !!!
Title: Re: Ускорение работы с файлом.
Post by: justitdo on September 12, 2014, 05:51:09 PM
Вставил код с поиском Finf file.exe.
У меня сейчас 8500 строк в файле, поиск происходит за разное время (от 26 до 50 мсек), задержку в ожидании ответа от программы Finf file.exe убрал вообще (строка 166).
Сейчас более 17000 строк, время поиска не увеличилось, хвала симбиозу Clickermann + ассемблер !!!
Объясните, пожалуйста, что это за программа и как сделать, чтобы она осуществляла поиск строки по текстовику в моем скрипте
Code: [Select]
WAIT(1)
 
LCLICK(1184,64)  // клик по адресной строке для выделения (установить свою координату!)
WAITMS(50)
KEYDOWN (#CTRL) // Ctrl+C
WAITMS (50)
KEYDOWN (#C)
WAITMS (50)
KEYUP (#C)
KEYUP (#CTRL)
WAITMS (50)
$strclip = FROMCLIP()
 
$action = 0
$count = TFCOUNT ("input.txt")
WHILE(0 < $count)
   $comp = TFRead("input.txt", $count)
   INC($count,-1)
   IF($comp = $strclip)
      $count = 0
      $action = 1
   END_IF
END_CYC
 
IF($action = 1)
   // сдесь действие если строка совпала
ELSE
   TFWRITE("input.txt", $strclip) // запись строки в файл
   WAITMS (50)
   // сдесь действие если строка не совпала
END_IF


Сейчас в текстовике около 20 тысяч строк, стал жестко тормозить, на поиск уходит секунд 5-7, очень хочется ускорить.
Title: Re: Ускорение работы с файлом.
Post by: Oraven on September 12, 2014, 06:32:02 PM
Циклы полюбому работают слишком медленно. А что если слить все строки в одну большую?!
Тогда можно функцией STRPOS проверить есть ли подстрока в строке и если вернет больше нуля значит есть а если 0 то дописать в конец нашу строку и тд.

Для начало вот таким скриптом объединяем строки в файле "input.txt"

Code: (clickermann) [Select]
WHILE($num < TFCOUNT ("input.txt"))
INC($num,1)
$str = TFREAD("input.txt", $num)
$str2 = STRCONCAT($str, " ", $str2)
END_CYC
TFWRITE("output.txt", $str2)
HALT

Получаем "output.txt", его опять переименовываем в "input.txt"

Используем в скрипте проверки.
Code: (clickermann) [Select]
WAIT(1)
 
LCLICK(1184,64)  // клик по адресной строке для выделения
WAITMS(50)
KEYDOWN (#CTRL) // Ctrl+C
WAITMS (50)
KEYDOWN (#C)
WAITMS (50)
KEYUP (#C)
KEYUP (#CTRL)
WAITMS (50)
$strclip = FROMCLIP()
WAITMS(50)
$comp = TFREAD("input.txt", 1)
WAITMS(50)
$action = STRPOS($comp, $strclip)
IF($action > 0)
   // сдесь действие если строка совпала
ELSE
   TFWRITE("input.txt", STRCONCAT($strclip," ")) // запись строки в файл
   WAITMS (50)
   // сдесь действие если строка не совпала
END_IF

Правда не знаю как это будет работать с очень большими строками.
Title: Re: Ускорение работы с файлом.
Post by: Atas on September 12, 2014, 06:58:24 PM
Кстати, в тестовой версии 4.11 заложены вкусные плюшки,  для работы с текстовыми файлами в том числе.
http://crapware.aidf.org/forum/index.php?topic=356.msg6738#msg6738
Вот вам и удобный случай протестировать.  :)
Title: Re: Ускорение работы с файлом.
Post by: justitdo on September 12, 2014, 07:23:08 PM
Андрей, спасибо, сейчас же протестирую. Atas Ну это я смогу протестировать только при поддержке местных гуру, потому что сам в этих кодах ничего не волоку)))
Title: Re: Ускорение работы с файлом.
Post by: justitdo on September 12, 2014, 07:41:54 PM
Циклы полюбому работают слишком медленно. А что если слить все строки в одну большую?!
Тогда можно функцией STRPOS проверить есть ли подстрока в строке и если вернет больше нуля значит есть а если 0 то дописать в конец нашу строку и тд.

Для начало вот таким скриптом объединяем строки в файле "input.txt"

Code: (clickermann) [Select]
WHILE($num < TFCOUNT ("input.txt"))
INC($num,1)
$str = TFREAD("input.txt", $num)
$str2 = STRCONCAT($str, " ", $str2)
END_CYC
TFWRITE("output.txt", $str2)
HALT

Получаем "output.txt", его опять переименовываем в "input.txt"

Используем в скрипте проверки.
Code: (clickermann) [Select]
WAIT(1)
 
LCLICK(1184,64)  // клик по адресной строке для выделения
WAITMS(50)
KEYDOWN (#CTRL) // Ctrl+C
WAITMS (50)
KEYDOWN (#C)
WAITMS (50)
KEYUP (#C)
KEYUP (#CTRL)
WAITMS (50)
$strclip = FROMCLIP()
WAITMS(50)
$comp = TFREAD("input.txt", 1)
WAITMS(50)
$action = STRPOS($comp, $strclip)
IF($action > 0)
   // сдесь действие если строка совпала
ELSE
   TFWRITE("input.txt", STRCONCAT($strclip," ")) // запись строки в файл
   WAITMS (50)
   // сдесь действие если строка не совпала
END_IF

Правда не знаю как это будет работать с очень большими строками.
Работает молниеносно!!! Специально тестировал на последней и на первой записи в строке, разницы в скорости не заметил!!! Только вото почему-то новая запись делается не к существующей строке, а записывается в новую, что-то не так...
Title: Re: Ускорение работы с файлом.
Post by: Vint on September 12, 2014, 08:26:18 PM
описка просто в 20 строке
TFWRITE("input.txt", STRCONCAT($comp," ",$strclip))
Title: Re: Ускорение работы с файлом.
Post by: justitdo on September 12, 2014, 08:49:30 PM
А так он полностью дублирует строку во вторую и уже к ней приписывает новую запись..
Title: Re: Ускорение работы с файлом.
Post by: Oraven on September 12, 2014, 09:09:17 PM
Точно, замени вот это
Code: (clickermann) [Select]
   TFWRITE("input.txt", STRCONCAT($strclip," ")) // запись строки в файл
вот этим
Code: (clickermann) [Select]
TFDELETE ("input.txt", 1)
WAITMS(50)
TFWRITE("input.txt", STRCONCAT($comp,$strclip," "))
Title: Re: Ускорение работы с файлом.
Post by: justitdo on September 12, 2014, 09:15:46 PM
Теперь работает) Протестирую сейчас в боевых условиях) Отпишу чуть позже.
UPD По сравнению с тем что было - шпарит как из пулемета))) Я уже и забыл что такая скорость бывает))) У меня есть файл на 200к строк, завтра проверю как с ним поведет себя. Спасибо огромное!
Title: Re: Ускорение работы с файлом.
Post by: justitdo on September 13, 2014, 08:02:54 AM
Только есть минус. В этом случае, если по какой-то ошибке в буфер обмена попадает текст с пробелами, то вся база из текстовика удаляется и сохраняется лишь текст из буфера... Я вчера так всю свою базу потерял, закончились рабочие вкладки в браузере и по ошибке в буфер скопировался текст из нескольких десятков слов, в итоге вся база удалилась, а в текстовике остался лишь этот текст,  хорошо что у меня копия базы была сохранена.
Title: Re: Ускорение работы с файлом.
Post by: justitdo on September 13, 2014, 09:00:10 AM
Можно как-то решить эту проблему? Я сейчас второй раз всю базу похерил.
для себя пока решил остановкой скрипта, когда заканчиваются вкладки. Но ведь могут быть и другие случаи.
возможно причина совсем не в том, что в буфер попадает текст с пробелами, но факт в том, что базу я дважды похерил, получив в первый раз текстовик с текстом из буфера, а во второй раз вообще пустой.
Title: Re: Ускорение работы с файлом.
Post by: Oraven on September 13, 2014, 09:44:51 AM
Вот решение. Фильтрация буфера и проверка на ссылки, если в буфере их нет то стоп. Также сделал запись резервной копии.

Фильтр удаляет пробелы и знак # в строке буфера. Оказалось что решетка записывается в файл но при последующем чтении строка обрезается на этом символе.

Есть идея преобразовать все ссылки в MD5 хеш тогда сравнение будет точным.
Code: (clickermann) [Select]
WAIT(1)

LCLICK(1184,64)  // клик по адресной строке для выделения
WAITMS(100)
KEYDOWN (#CTRL) // Ctrl+C
WAITMS (50)
KEYDOWN (#C)
WAITMS (50)
KEYUP (#C)
KEYUP (#CTRL)
WAITMS (50)
$strclip = STRFILTER(FROMCLIP(), " #", 0) // фильтр буфера
WAITMS(50)

IF((STRPOS($strclip,"http:") > 0) | (STRPOS($strclip,"https:") > 0)) // проверка на ссылки
ELSE
   LOGWRITE ("Ошибка: строка из буфера не содержит ссылки.")
   HALT
END_IF

IF(TFCOUNT ("input.txt") > 0)
   $comp = TFREAD("input.txt", 1)
   WAITMS(50)
   $action = STRPOS($comp, $strclip)
   IF($action > 0)
      LOGWRITE ("Совпадение")
      // сдесь действие если строка совпала
   ELSE
      TFWRITE("input_bak.txt", $comp) // запись резервной копии
      TFWRITE("input_bak.txt", " ")
      TFDELETE ("input.txt", 1)
      WAITMS(50)
      TFWRITE("input.txt", STRCONCAT($comp,$strclip," "))
      WAITMS (50)
   END_IF
ELSE
   TFWRITE("input.txt", STRCONCAT($strclip," "))
   WAITMS (50)
END_IF
Title: Re: Ускорение работы с файлом.
Post by: justitdo on September 13, 2014, 09:53:42 AM
Андрей, у меня не ссылка с адресной строки копируется, а лишь ее часть  пяти-восьми значное число. Но иногда бывает, что или вкладка другая откроется, или браузер обрушится, или еще какая ошибка и в буфер попадает не то что надо.  Конкретно, когда второй раз я потерял базу, в буфер попал знак "=" или "/"
Title: Re: Ускорение работы с файлом.
Post by: Oraven on September 13, 2014, 09:58:51 AM
Ну надо чтоб вся ссылка, а то как скрипт поймет что это ссылка? Её после можно обрезать. Пример ссылок приведи.
Title: Re: Ускорение работы с файлом.
Post by: justitdo on September 13, 2014, 10:23:24 AM
А для чего вообще проверка на ссылки? Нельзя сделать, чтобы скрипт останавливался, если в буфер попадает что-то, кроме цифр?
Не могу понять, почему у меня 2 раза пропали все записи из текстовика, сейчас попробовал повторить те же условия, при которых текстовик стал пустой - все записывается нормально, странно очень
А за запись резервной копии отдельное спасибо.
Title: Re: Ускорение работы с файлом.
Post by: aden on September 13, 2014, 10:48:02 AM
при копировании части ссылки проверять длину и если она не подходит под условия не вставлять в файл
Title: Re: Ускорение работы с файлом.
Post by: Oraven on September 13, 2014, 11:17:14 AM
Вот проверка только на цифры и от пяти символов и более. В логе отобразится что не так и что за стрjка.

Code: (clickermann) [Select]
WAIT(1)

LCLICK(1184,64)  // клик по адресной строке для выделения
WAITMS(100)
KEYDOWN (#CTRL) // Ctrl+C
WAITMS (50)
KEYDOWN (#C)
WAITMS (50)
KEYUP (#C)
KEYUP (#CTRL)
WAITMS (50)
$strclip = FROMCLIP()
WAITMS(50)

IF(STRLEN($strclip) > 4) // длинна сторки от 5и символов и более
   $strclip2 = STRFILTER($strclip, "1234567890", 0)
   IF(STRLEN($strclip2) > 1)
      LOGWRITE ("Ошибка: что то кроме цифр")
      LOGWRITE ($strclip)
      HALT
   END_IF
ELSE
   LOGWRITE ("Ошибка: Пустой буфер или короткая строка")
   LOGWRITE ($strclip)
   HALT
END_IF

IF(TFCOUNT ("input.txt") > 0)
   $comp = TFREAD("input.txt", 1)
   WAITMS(50)
   $action = STRPOS($comp, $strclip)
   IF($action > 0)
      LOGWRITE ("Совпадение")
      // сдесь действие если строка совпала
   ELSE
      TFWRITE("input_bak.txt", $comp) // запись резервной копии
      TFWRITE("input_bak.txt", " ")
      TFDELETE ("input.txt", 1)
      WAITMS(50)
      TFWRITE("input.txt", STRCONCAT($comp,$strclip," "))
      WAITMS (50)
   END_IF
ELSE
   TFWRITE("input.txt", STRCONCAT($strclip," "))
   WAITMS (50)
END_IF



Title: Re: Ускорение работы с файлом.
Post by: justitdo on September 13, 2014, 12:12:21 PM
Прошу прощения за нубский вопрос, но куда мне писать действие, если строка не совпала? =)
Title: Re: Ускорение работы с файлом.
Post by: Oraven on September 13, 2014, 12:27:44 PM
Прошу прощения за нубский вопрос, но куда мне писать действие, если строка не совпала? =)

Code: (clickermann) [Select]
      // сдесь действие если строка совпала
  ELSE
     TFWRITE("input_bak.txt", $comp) // запись резервной копии
     TFWRITE("input_bak.txt", " ")
     TFDELETE ("input.txt", 1)
     WAITMS(50)
     TFWRITE("input.txt", STRCONCAT($comp,$strclip," "))
     WAITMS (50)
// <==сюда
Title: Re: Ускорение работы с файлом.
Post by: justitdo on October 13, 2014, 11:23:37 PM
Вот проверка только на цифры и от пяти символов и более. В логе отобразится что не так и что за стрjка.

Code: (clickermann) [Select]
WAIT(1)

LCLICK(1184,64)  // клик по адресной строке для выделения
WAITMS(100)
KEYDOWN (#CTRL) // Ctrl+C
WAITMS (50)
KEYDOWN (#C)
WAITMS (50)
KEYUP (#C)
KEYUP (#CTRL)
WAITMS (50)
$strclip = FROMCLIP()
WAITMS(50)

IF(STRLEN($strclip) > 4) // длинна сторки от 5и символов и более
   $strclip2 = STRFILTER($strclip, "1234567890", 0)
   IF(STRLEN($strclip2) > 1)
      LOGWRITE ("Ошибка: что то кроме цифр")
      LOGWRITE ($strclip)
      HALT
   END_IF
ELSE
   LOGWRITE ("Ошибка: Пустой буфер или короткая строка")
   LOGWRITE ($strclip)
   HALT
END_IF

IF(TFCOUNT ("input.txt") > 0)
   $comp = TFREAD("input.txt", 1)
   WAITMS(50)
   $action = STRPOS($comp, $strclip)
   IF($action > 0)
      LOGWRITE ("Совпадение")
      // сдесь действие если строка совпала
   ELSE
      TFWRITE("input_bak.txt", $comp) // запись резервной копии
      TFWRITE("input_bak.txt", " ")
      TFDELETE ("input.txt", 1)
      WAITMS(50)
      TFWRITE("input.txt", STRCONCAT($comp,$strclip," "))
      WAITMS (50)
   END_IF
ELSE
   TFWRITE("input.txt", STRCONCAT($strclip," "))
   WAITMS (50)
END_IF



Привет. Опять у меня новая проблема) Помоги, пожалуйста, подскажи, что исправить в этом скрипте, чтобы буфер анализировался не на количество символов, а на величину числа? То есть задаем в скрипте число, к примеру 356 и если число в буфере меньше, например 345, то выполняется заданная команда.
Title: Re: Ускорение работы с файлом.
Post by: Oraven on October 14, 2014, 12:58:02 AM
Теперь в базе данных разделителями считаются запятые, поэтому если ты будешь использовать предыдущую базу данных нужно в ней заменить все пробелы запятыми. Это легко сделать в обычном блокноте командой "Заменить".

Code: (clickermann) [Select]
//==== НАСТРОЙКИ =====================
$num = 356 // допук чисел меньше этого
//====================================

WAIT(1)

LCLICK(1184,64)  // клик по адресной строке для выделения
WAITMS(100)
KEYDOWN (#CTRL) // Ctrl+C
WAITMS (50)
KEYDOWN (#C)
WAITMS (50)
KEYUP (#C)
KEYUP (#CTRL)
WAITMS (50)
$strclip = FROMCLIP()
WAITMS(50)

IF(STRLEN($strclip) > 0) // длинна сторки от 5и символов и более
   $strclip2 = STRFILTER($strclip, "1234567890", 0)
   IF(STRLEN($strclip2) > 1)
      HINTPOPUP("что то кроме цифр!", "Ошибка")
      LOGWRITE ("Ошибка: что то кроме цифр")
      LOGWRITE ($strclip)
      HALT
   END_IF
ELSE
   HINTPOPUP("Пустой буфер!", "Ошибка")
   LOGWRITE ("Ошибка: Пустой буфер!")
   LOGWRITE ($strclip)
   HALT
END_IF

IF(INT($strclip) < $num)
   IF(TFCOUNT ("input.txt") > 0)
      $comp = TFREAD("input.txt", 1)
      WAITMS(50)
      $action = STRPOS($comp, STRCONCAT(",",$strclip,","))
      IF($action > 0)
         LOGWRITE ("Совпадение")
         // сдесь действие если строка совпала
         
      ELSE
         TFWRITE("input_bak.txt", $comp) // запись резервной копии
         TFWRITE("input_bak.txt", " ")
         TFDELETE ("input.txt", 1)
         WAITMS(50)
         TFWRITE("input.txt", STRCONCAT($comp,$strclip,","))
         WAITMS (50)
      END_IF
   ELSE
      TFWRITE("input.txt", STRCONCAT(",",$strclip,","))
      WAITMS (50)
   END_IF
ELSE
   // Если число выше заданного все действия пропускаются
   LOGWRITE ("число выше заданного.")
END_IF
Title: Re: Ускорение работы с файлом.
Post by: justitdo on October 14, 2014, 06:01:44 AM
Теперь в базе данных разделителями считаются запятые, поэтому если ты будешь использовать предыдущую базу данных нужно в ней заменить все пробелы запятыми. Это легко сделать в обычном блокноте командой "Заменить".

Code: (clickermann) [Select]
//==== НАСТРОЙКИ =====================
$num = 356 // допук чисел меньше этого
//====================================

WAIT(1)

LCLICK(1184,64)  // клик по адресной строке для выделения
WAITMS(100)
KEYDOWN (#CTRL) // Ctrl+C
WAITMS (50)
KEYDOWN (#C)
WAITMS (50)
KEYUP (#C)
KEYUP (#CTRL)
WAITMS (50)
$strclip = FROMCLIP()
WAITMS(50)

IF(STRLEN($strclip) > 0) // длинна сторки от 5и символов и более
   $strclip2 = STRFILTER($strclip, "1234567890", 0)
   IF(STRLEN($strclip2) > 1)
      HINTPOPUP("что то кроме цифр!", "Ошибка")
      LOGWRITE ("Ошибка: что то кроме цифр")
      LOGWRITE ($strclip)
      HALT
   END_IF
ELSE
   HINTPOPUP("Пустой буфер!", "Ошибка")
   LOGWRITE ("Ошибка: Пустой буфер!")
   LOGWRITE ($strclip)
   HALT
END_IF

IF(INT($strclip) < $num)
   IF(TFCOUNT ("input.txt") > 0)
      $comp = TFREAD("input.txt", 1)
      WAITMS(50)
      $action = STRPOS($comp, STRCONCAT(",",$strclip,","))
      IF($action > 0)
         LOGWRITE ("Совпадение")
         // сдесь действие если строка совпала
         
      ELSE
         TFWRITE("input_bak.txt", $comp) // запись резервной копии
         TFWRITE("input_bak.txt", " ")
         TFDELETE ("input.txt", 1)
         WAITMS(50)
         TFWRITE("input.txt", STRCONCAT($comp,$strclip,","))
         WAITMS (50)
      END_IF
   ELSE
      TFWRITE("input.txt", STRCONCAT(",",$strclip,","))
      WAITMS (50)
   END_IF
ELSE
   // Если число выше заданного все действия пропускаются
   LOGWRITE ("число выше заданного.")
END_IF
Спасибо, но немного не то. Мне нужно, чтобы порядок действия скрипта был как и прежде, но если число в буфере меньше заданного - выполнялось другое действие, конкретно для моей задачи это закрытие вкладки (ctrl+f4) В общем мне надо, чтобы скрипт работал только с числами выше заданного, если оно ниже - то вкладка закрывается и скрипт запускается заново на следующей вкладке.
Title: Re: Ускорение работы с файлом.
Post by: Oraven on October 14, 2014, 01:04:43 PM
А сразу об этом написать не судьба?

Code: (clickermann) [Select]
//==== НАСТРОЙКИ =====================
$num = 356 // допук чисел больше этого
//====================================

WAIT(1)

LCLICK(1184,64)  // клик по адресной строке для выделения
WAITMS(100)
KEYDOWN (#CTRL) // Ctrl+C
WAITMS (50)
KEYDOWN (#C)
WAITMS (50)
KEYUP (#C)
KEYUP (#CTRL)
WAITMS (50)
$strclip = FROMCLIP()
WAITMS(50)

IF(STRLEN($strclip) > 0)
   $strclip2 = STRFILTER($strclip, "1234567890", 0)
   IF(STRLEN($strclip2) > 1)
      HINTPOPUP("что то кроме цифр!", "Ошибка")
      LOGWRITE ("Ошибка: что то кроме цифр")
      LOGWRITE ($strclip)
      HALT
   END_IF
ELSE
   HINTPOPUP("Пустой буфер!", "Ошибка")
   LOGWRITE ("Ошибка: Пустой буфер!")
   LOGWRITE ($strclip)
   HALT
END_IF

IF(INT($strclip) > $num) // если число больше заданного
   IF(TFCOUNT ("input.txt") > 0)
      $comp = TFREAD("input.txt", 1)
      WAITMS(50)
      $action = STRPOS($comp, STRCONCAT(",",$strclip,","))
      IF($action > 0)
         LOGWRITE ("Совпадение")
         // сдесь действие если строка совпала
         
      ELSE
         TFWRITE("input_bak.txt", $comp) // запись резервной копии
         TFWRITE("input_bak.txt", " ")
         TFDELETE ("input.txt", 1)
         WAITMS(50)
         TFWRITE("input.txt", STRCONCAT($comp,$strclip,","))
         WAITMS (50)
      END_IF
   ELSE
      TFWRITE("input.txt", STRCONCAT(",",$strclip,","))
      WAITMS (50)
   END_IF
ELSE
   // если меньше заданного
   KEYDOWN (#CTRL) // Ctrl+F4
   WAITMS (50)
   KEYDOWN (#F4)
   WAITMS (50)
   KEYUP (#F4)
   KEYUP (#CTRL)
   WAIT(1)
END_IF
Title: Re: Ускорение работы с файлом.
Post by: justitdo on October 14, 2014, 01:25:20 PM
А сразу об этом написать не судьба?

Да я как-бы об этом сразу и писал, просто видимо не ясно выразился и ты не так понял. Прочитай внимательно)
То есть задаем в скрипте число, к примеру 356 и если число в буфере меньше, например 345, то выполняется заданная команда.
Заданная команда в моем случае это закрытие вкладки (ctrl+F4)
Спасибо)
Я, кстати сам пробовал точь в точь как ты написал, но у меня почему-то вкладки не прекращались закрываться, пока не остановишь скрипт вручную, сейчас твой попробую.
Title: Re: Ускорение работы с файлом.
Post by: Oraven on February 08, 2017, 09:42:18 AM
Code: (clickermann) [Select]
$str = FROMCLIP()
$str = STRCUT2($str, STRPOS($str, "sid")+4, STRLEN($str))
$str = STRCUT2($str, 1, STRPOS($str, "&")-1)
LOGWRITE ($str)

HALT