06.03.2020, 17:09 | #1 |
Участник
|
Обработка изображений
Всем доброго дня.
У нас есть фотографии товаров. Хранятся в БД. Подавляющее большенство фотографий содержит белые края, порой очень даже большие. Появилась потребность взять и избавиться от них, но сделать это программным путем. Мы сейчас используем скрипт на питоне который анализирует фото, если края белые, то обрезает их до 20-ти пикселей и полученное изображение сохраняет в новый файл. Но есть две проблемы: 1) После вызова WinAPI::shellExecute() с параметром _waitForCompletion = true, проверяем наличие созданного файла и его нет. Если поставить задержку 700-900 милисекунд, то файл появляется. Т.е Ах получила отклик что выполнение закончилось, идет дальше по коду, а файла нет. Мы думаем что после выполнения скрипта сборщик мусора производит свои манипуляции и только в этот момент происходит окончательная запись в файл. Может можно его как-то заставить мгновенно сохранять? 2) Фотографии хранятся в разных форматах (jpg и png). Скрипт преобразовывает png в jpg, при этом на фото появляются шумы. Кто-нибудь сталкивался с подобной проблемой? Если да то как её решали? Либо у вас какой-нибудь другой способ? P.S. Чукча не Python-щик) |
|
06.03.2020, 17:18 | #2 |
Участник
|
А если в самом скрипте ждать появления файла и только тогда завершать скрипт?
|
|
06.03.2020, 18:35 | #3 |
Участник
|
Добавил в скрипт
PHP код:
Пробую в Ах, таже беда. Не видит файл. Если в Ах добавить конструкцию подобною той что выше, то все норм. После 2-3 ожиданий Ах видит файл и обрабатывает его. |
|
06.03.2020, 19:23 | #4 |
Участник
|
Такое ощущение, что файловая система отрабатывает как версионная БД. Кто файл создавал, тот его сразу видит. А все остальные - только после некоего коммита, который происходит с задержкой по времени. Может проблема не в питоне, а в том как винда с файлами работает ?
Хотя скорее всего чудес нет и это какая-то отложенная (асинхронная) сборка мусора в питоне, которая сбрасывает файл на диск с задержкой, в момент его реального закрытия и высвобождения всех ресурсов. Но тогда вопрос, как там принудительно заставить файл сброситься на диск и высвободить все ресурсы. |
|
10.03.2020, 10:21 | #5 |
Участник
|
Если запись происходит на файловое хранилище и под разными пользователями (под кем запускается AOS, отличается под кем крутится скрипт), то это нормальное поведение с файлами.
__________________
Любую техническую проблему можно решить, если есть достаточно времени и денег. |
|
10.03.2020, 10:29 | #6 |
Участник
|
Цитата:
Фишка в том что скрипт питона запущенный из под аоса отработал, а результат не увидел. Он ему доступен через некоторое время. Правда ? Это почему ? |
|
10.03.2020, 10:56 | #7 |
Участник
|
Ссылка
Из статьи: Цитата:
Дело в том, что в версии SMB v2.x, представленном в Windows 2008 / Vista (см. таблицу с версиями протокола SMB) для уменьшения трафика и количества SMB запросов между SMB-клиентом и сервером, и ускорения доступа к общим папкам и файлам по сети стал использоваться механизм кэширования (это дает ощутимый эффект при доступе к сетевой папке через медленный канал или канал с большими задержками). Таким образом компонента Microsoft Redirector на компьютерах пользователей использует локальный кэш с метаданными сетевого каталога. По умолчанию этот кэш очищается каждые 10 секунд.
__________________
Любую техническую проблему можно решить, если есть достаточно времени и денег. |
|
|
За это сообщение автора поблагодарили: Logger (3). |
10.03.2020, 11:18 | #8 |
Участник
|
Интересно.
Но у нас не тот случай. Юзер один. Папка - локальный темп. |
|
10.03.2020, 14:35 | #9 |
Участник
|
А отключение индексации файлов на сервере (Windows Search) не помогает ?
|
|
10.03.2020, 16:14 | #10 |
Участник
|
А служба Windows Search не установлена.
|
|
10.03.2020, 20:11 | #11 |
Участник
|
А проблема именно в питоне ? Просто в ShellExecute явного высвобождения дескриптора не происходит, что если добавить явный вызов CloseHandlе в конце метода ?
Или, например, вместо ShellExecute, использовать функцию CreateProcess ? https://stackoverflow.com/questions/...execute-to-run
__________________
Sergey Nefedov |
|
11.03.2020, 17:47 | #12 |
Участник
|
Я предложу альтернативное решение.
два батча джоба #1. Делает экспорт из БД файликов. Имя файлика == RecId (Ну или как удобней будет для уникальной идентификации файлика к записи) Выполняет экспорт пачками по 100-1000 файликов за один раз Надо добавить чтобы он помечал запись как выгруженную, чтобы ее повторно не экспортировать. Питон смотрит на файловую папку inbound. Делает свою магию и складывает сконверченные картинки в папку outbound. Те которые не надо конвертить - удаляет. Из inbound тоже удаляет после обработки. #2. Батч которые время от времени сканирует папку outbound. Если файлики есть, то забирает их к себе в БД. Файлики удаляет. |
|
Теги |
ax2012, ax4.0 |
|
Похожие темы | ||||
Тема | Ответов | |||
2009 AX, Вставка в grid нескольких изображений | 17 | |||
Обработка изображений в аксапте 3.0 | 1 | |||
Обработка входящего НДС | 12 | |||
Висит обработка фактуры | 12 | |||
Суммарная обработка накладной | 1 |
|