Что нового

Проблема при работе с большим объемом текста

kupog

Новичок
Сообщения
12
Репутация
1
Вероятно кто-то подскажет решение по своему опыту или как обойти эту проблему\ввести проверку. Есть такой код:
Код:
$Data = FileRead(@ScriptDir&"\Folder\1.txt")
$File = FileOpen(@ScriptDir&"\Folder2\2.txt", 17)
FileWrite($File, $Data)
FileClose($File)
RunWait(@ScriptDir&"\1.exe", "", @SW_HIDE)
FileDelete(@ScriptDir&"\Folder2\2.txt")

Считывается фаил весом до 10 мб. (может быть несколько фаилов, например 5 фаилов, считанные по очереди (их содержимое) и записанные по очереди в один). Затем запускается программа, которая загружает все записанное из Folder2\2.txt в базу данных. Затем все удаляется и по новой.
Проблема из наблюдений... Бывает 2.txt не дописывается до конца, т.е. обрыв данных происходит, FileWrite() закончил работу, FileClose() выполнился и пошел RunWait... А данные в 2.txt не все успело записать, либо как подозреваю, в скрипте все это выполнено, а на сам жесткий диск не успело записаться\отобразить, когда начинает выполнять RunWait. Получается вопрос, как ввести проверку на то, что после FileClose() фаил полностью записался на диск. Пробовал ставить Sleep(250), пробовал 1000. Не помогает, все равно иногда не успевает все записать и проскакивает "битый фаил" в базу данных.
Есть также подозрения на команду FileDelete() после RunWait()... И перед ней пробовал ставить паузы. Но все равно... Не помогает.
Есть машины на которых все идеально работает, без каких-либо проблем. А есть машины, их в меньшинстве и независимо от операционной системы... Происходят сбои описанные выше. :stars: Пока из мыслей, не знаю поможет ли или улучшить ли ситуацию. Когда например 5 фаилов, то не писать их по очереди, а сначала все 5 считать, объединить в одну переменную и записать разом, но... Почему-то кажется не решит это проблемы.
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Если 1.exe понимает, что надо считать 2.txt, то зачем остальная движуха, почему не скормить ей сразу 1.txt?
Соответственно в цикле считывать 5 файлов по очереди без перезаписи в один файл.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
kupog [?]
как ввести проверку на то, что после FileClose() фаил полностью записался на диск
После FileClose записывается то что было указано.

Я вижу 17 при открытий файла, это значит что данные записываются в конец файла, может быть проще копировать файл?
 
Автор
K

kupog

Новичок
Сообщения
12
Репутация
1
hedji сказал(а):
Если 1.exe понимает, что надо считать 2.txt, то зачем остальная движуха, почему не скормить ей сразу 1.txt?
Соответственно в цикле считывать 5 файлов по очереди без перезаписи в один файл.
Это просто пример упрощенный реализации. На деле все немного сложнее. Правильно, 1.exe понимает, что нужно считать. Но не понимает когда и что, и для 1.exe уже нужно подать готовый фаил. ПОэтому так. А то, откуда считывается, там появляются фаилы. К примеру появилось 3 фаила, соответственно выполнилось 3 раза в последовательности - считать, создать 2.txt, записать, либо считать, дописать в конец 2.txt и после запустить 1.exe на выполнение и удалить 2.txt
CreatoR сказал(а):
kupog [?]После FileClose записывается то что было указано.

Я вижу 17 при открытий файла, это значит что данные записываются в конец файла, может быть проще копировать файл?
Все верно, данные в конец фаила записываются. Было бы проще копировать или на прямую запускать 1.exe для считывания. Но, к сожалению все не так просто. Бывает нужно из 5 фаилов сделать один, т.е. 5 считать и каждый по очереди дописать в один. И бывает так, что 4 фаила весят по ~50 кб, а 5ый аж 8 мб. И если я правильно понимаю, то в таких случаях Аутоит не ждет конца записи после выполнения FileClose(), а переходит сразу на выполнение запуска 1.exe, из-за этого и "косяки". Но сделать Sleep на 20 секунд тоже совсем не вариант, чтобы дожидаться, пока одумается винчестер и все допишет. Следовательно моя теория о том, что все считанные фаилы можно попробовать объединить в самом скрипте в один (одну переменную) и сразу одним действием записать в один фаил, а не 5 раз открывать его и дописывать в него, в конец... Тоже не поможет по всей видимости.
 
Сообщения
142
Репутация
-3
Я несколько раз перечитал, так и не понял, что ТС нужно.

Ты уверен, что проблема не в FileRead, которая, неожиданно, читает файл не до конца? Перепиши, чтобы было через FileOpen.
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Откуда 1.exe знает про 2.txt?
Копайте в этом направлении, чтобы на выходе получить что-то типа
Код:
for $file in $folder_files
    $command = "1.exe -f " & $file
    RunWait(@ScriptDir & $command, "", @SW_HIDE)
next
 
Автор
K

kupog

Новичок
Сообщения
12
Репутация
1
ЭйчЭйч сказал(а):
Я несколько раз перечитал, так и не понял, что ТС нужно.

Ты уверен, что проблема не в FileRead, которая, неожиданно, читает файл не до конца? Перепиши, чтобы было через FileOpen.
Хорошо, можно попробовать как вариант так реализовать. Все же в справке чтение реализовано через открытие файла. А это уже о чем-то говорит. Вероятно поможет в моей проблеме. Хотя проблема больше наблюдается именно в том, что не дописывает до конца, а не считывает где-то. Т.к. всегда это в конце фаила, а не где-то в середине пропажа данных.
hedji сказал(а):
Откуда 1.exe знает про 2.txt?
Копайте в этом направлении, чтобы на выходе получить что-то типа
Код:
for $file in $folder_files
    $command = "1.exe -f " & $file
    RunWait(@ScriptDir & $command, "", @SW_HIDE)
next
Спасибо, наверное в этом направление и реализую, как раз примерно об этом думал)
Только тут проблема в том, что фаил появится, но может быть не дописанным до конца, когда это сработает.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
kupog [?]
к сожалению все не так просто
Может в этом и проблема? Нужно проще :smile:...

если я правильно понимаю, то в таких случаях AutoIt не ждет конца записи после выполнения FileClose()
Неправильно.
FileOpen открывает файл и возвращает дескриптор, FileClose закрывает. Всё что происходит между - либо происходит либо нет.

Может лучше описать целиком задачу, и не пытаться понять почему не работает, а мы уже постараемся нарисовать вкратце методы решения.
 

hedji

Продвинутый
Сообщения
409
Репутация
94
kupog сказал(а):
Только тут проблема в том, что фаил появится, но может быть не дописанным до конца, когда это сработает.
Кормить только файлами, которые изменены более N-минут назад.
 
Автор
K

kupog

Новичок
Сообщения
12
Репутация
1
CreatoR сказал(а):
kupog [?]Может в этом и проблема? Нужно проще :smile:...
Неправильно.
FileOpen открывает файл и возвращает дескриптор, FileClose закрывает. Всё что происходит между - либо происходит либо нет.

Может лучше описать целиком задачу, и не пытаться понять почему не работает, а мы уже постараемся нарисовать вкратце методы решения.
Да в том то и дело, что все работает и не работает только на "избранных" ПК, и то... Через раз. В данный момент я увидел несколько вероятных проблем этого происходящего, попробую переписать скрипт, если не исправит проблему, тогда уже дальше буду спрашивать.
1) Сделаю сначала FileOpen и только затем FileRead.
2) Буду считывать все и объединять в одну переменную и только затем все записывать, а не постоянно открывать\закрывать фаил, дописывая. Думаю это оптимизирует процесс.
3) Если не поможет п.1 и 2, прийдется добавить проверки. Одна из идей - брать размер фаилов, суммировать и сверять с размером "собранного" и когда размеры совпадут, тогда и запускать считывание нового фаила)
 
Автор
K

kupog

Новичок
Сообщения
12
Репутация
1
kupog сказал(а):
Да в том то и дело, что все работает и не работает только на "избранных" ПК, и то... Через раз. В данный момент я увидел несколько вероятных проблем этого происходящего, попробую переписать скрипт, если не исправит проблему, тогда уже дальше буду спрашивать.
1) Сделаю сначала FileOpen и только затем FileRead.
2) Буду считывать все и объединять в одну переменную и только затем все записывать, а не постоянно открывать\закрывать фаил, дописывая. Думаю это оптимизирует процесс.
3) Если не поможет п.1 и 2, прийдется добавить проверки. Одна из идей - брать размер фаилов, суммировать и сверять с размером "собранного" и когда размеры совпадут, тогда и запускать считывание нового фаила)
В общем п.1,2 не помогли, а 3 помогло совместно с п.2. Проблема нашлась в том, что выполнялась команда FileWrite() и FilceClose(), сам фаил появился, но пустым и информация на него с задержкой записывалась. Возможно связано с каким-то сжатием фаилов на некоторых ПК. (хотя в настройках отключено) Но почему-то жмутся (размер у них меньше, чем на тех ПК, которых стабильно работал скрипт, хотя сам фаил без потерь)
 
Верх