Author Topic: Ускорение работы с файлом.  (Read 19214 times)

0 Members and 1 Guest are viewing this topic.

justitdo

  • Освоившийся
  • **
  • Posts: 45
    • View Profile
Re: Ускорение работы с файлом.
« Reply #30 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

Правда не знаю как это будет работать с очень большими строками.
Работает молниеносно!!! Специально тестировал на последней и на первой записи в строке, разницы в скорости не заметил!!! Только вото почему-то новая запись делается не к существующей строке, а записывается в новую, что-то не так...

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Ускорение работы с файлом.
« Reply #31 on: September 12, 2014, 08:26:18 PM »
описка просто в 20 строке
TFWRITE("input.txt", STRCONCAT($comp," ",$strclip))


justitdo

  • Освоившийся
  • **
  • Posts: 45
    • View Profile
Re: Ускорение работы с файлом.
« Reply #32 on: September 12, 2014, 08:49:30 PM »
А так он полностью дублирует строку во вторую и уже к ней приписывает новую запись..

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Ускорение работы с файлом.
« Reply #33 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," "))

justitdo

  • Освоившийся
  • **
  • Posts: 45
    • View Profile
Re: Ускорение работы с файлом.
« Reply #34 on: September 12, 2014, 09:15:46 PM »
Теперь работает) Протестирую сейчас в боевых условиях) Отпишу чуть позже.
UPD По сравнению с тем что было - шпарит как из пулемета))) Я уже и забыл что такая скорость бывает))) У меня есть файл на 200к строк, завтра проверю как с ним поведет себя. Спасибо огромное!
« Last Edit: September 12, 2014, 09:40:40 PM by justitdo »

justitdo

  • Освоившийся
  • **
  • Posts: 45
    • View Profile
Re: Ускорение работы с файлом.
« Reply #35 on: September 13, 2014, 08:02:54 AM »
Только есть минус. В этом случае, если по какой-то ошибке в буфер обмена попадает текст с пробелами, то вся база из текстовика удаляется и сохраняется лишь текст из буфера... Я вчера так всю свою базу потерял, закончились рабочие вкладки в браузере и по ошибке в буфер скопировался текст из нескольких десятков слов, в итоге вся база удалилась, а в текстовике остался лишь этот текст,  хорошо что у меня копия базы была сохранена.
« Last Edit: September 13, 2014, 08:05:02 AM by justitdo »

justitdo

  • Освоившийся
  • **
  • Posts: 45
    • View Profile
Re: Ускорение работы с файлом.
« Reply #36 on: September 13, 2014, 09:00:10 AM »
Можно как-то решить эту проблему? Я сейчас второй раз всю базу похерил.
для себя пока решил остановкой скрипта, когда заканчиваются вкладки. Но ведь могут быть и другие случаи.
возможно причина совсем не в том, что в буфер попадает текст с пробелами, но факт в том, что базу я дважды похерил, получив в первый раз текстовик с текстом из буфера, а во второй раз вообще пустой.
« Last Edit: September 13, 2014, 09:16:19 AM by justitdo »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Ускорение работы с файлом.
« Reply #37 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
« Last Edit: September 13, 2014, 09:59:21 AM by Oraven »

justitdo

  • Освоившийся
  • **
  • Posts: 45
    • View Profile
Re: Ускорение работы с файлом.
« Reply #38 on: September 13, 2014, 09:53:42 AM »
Андрей, у меня не ссылка с адресной строки копируется, а лишь ее часть  пяти-восьми значное число. Но иногда бывает, что или вкладка другая откроется, или браузер обрушится, или еще какая ошибка и в буфер попадает не то что надо.  Конкретно, когда второй раз я потерял базу, в буфер попал знак "=" или "/"

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Ускорение работы с файлом.
« Reply #39 on: September 13, 2014, 09:58:51 AM »
Ну надо чтоб вся ссылка, а то как скрипт поймет что это ссылка? Её после можно обрезать. Пример ссылок приведи.

justitdo

  • Освоившийся
  • **
  • Posts: 45
    • View Profile
Re: Ускорение работы с файлом.
« Reply #40 on: September 13, 2014, 10:23:24 AM »
А для чего вообще проверка на ссылки? Нельзя сделать, чтобы скрипт останавливался, если в буфер попадает что-то, кроме цифр?
Не могу понять, почему у меня 2 раза пропали все записи из текстовика, сейчас попробовал повторить те же условия, при которых текстовик стал пустой - все записывается нормально, странно очень
А за запись резервной копии отдельное спасибо.
« Last Edit: September 13, 2014, 10:39:02 AM by justitdo »

aden

  • Оплот сообщества
  • ****
  • Posts: 363
    • View Profile
Re: Ускорение работы с файлом.
« Reply #41 on: September 13, 2014, 10:48:02 AM »
при копировании части ссылки проверять длину и если она не подходит под условия не вставлять в файл

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Ускорение работы с файлом.
« Reply #42 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



« Last Edit: September 13, 2014, 12:28:18 PM by Oraven »

justitdo

  • Освоившийся
  • **
  • Posts: 45
    • View Profile
Re: Ускорение работы с файлом.
« Reply #43 on: September 13, 2014, 12:12:21 PM »
Прошу прощения за нубский вопрос, но куда мне писать действие, если строка не совпала? =)

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Ускорение работы с файлом.
« Reply #44 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)
// <==сюда