AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.03.2020, 17:09   #1  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Обработка изображений
Всем доброго дня.
У нас есть фотографии товаров. Хранятся в БД. Подавляющее большенство фотографий содержит белые края, порой очень даже большие. Появилась потребность взять и избавиться от них, но сделать это программным путем.
Мы сейчас используем скрипт на питоне который анализирует фото, если края белые, то обрезает их до 20-ти пикселей и полученное изображение сохраняет в новый файл.
Но есть две проблемы:
1) После вызова WinAPI::shellExecute() с параметром _waitForCompletion = true, проверяем наличие созданного файла и его нет. Если поставить задержку 700-900 милисекунд, то файл появляется. Т.е Ах получила отклик что выполнение закончилось, идет дальше по коду, а файла нет.
Мы думаем что после выполнения скрипта сборщик мусора производит свои манипуляции и только в этот момент происходит окончательная запись в файл. Может можно его как-то заставить мгновенно сохранять?
2) Фотографии хранятся в разных форматах (jpg и png). Скрипт преобразовывает png в jpg, при этом на фото появляются шумы.

Кто-нибудь сталкивался с подобной проблемой? Если да то как её решали? Либо у вас какой-нибудь другой способ?

P.S. Чукча не Python-щик)
Старый 06.03.2020, 17:18   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
А если в самом скрипте ждать появления файла и только тогда завершать скрипт?
Старый 06.03.2020, 18:35   #3  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Добавил в скрипт
PHP код:
fileCreated False
retryCnt 
5
idx 
1
        
while fileCreated == False and idx <= retryCnt:        
    if 
os.path.isfile(outp_dir '/' file_name):
        
fileCreated True
        
print('exist')
    else:
        
time.sleep(300);
        print(
300)
        
idx += 
Погонял его через командную строку. Во время всех тестов всегда печатал только "exist". Ни разу не печатал "300". Проверял на 16 фотографиях за раз.
Пробую в Ах, таже беда. Не видит файл.
Если в Ах добавить конструкцию подобною той что выше, то все норм. После 2-3 ожиданий Ах видит файл и обрабатывает его.
Старый 06.03.2020, 19:23   #4  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Такое ощущение, что файловая система отрабатывает как версионная БД. Кто файл создавал, тот его сразу видит. А все остальные - только после некоего коммита, который происходит с задержкой по времени. Может проблема не в питоне, а в том как винда с файлами работает ?

Хотя скорее всего чудес нет и это какая-то отложенная (асинхронная) сборка мусора в питоне, которая сбрасывает файл на диск с задержкой, в момент его реального закрытия и высвобождения всех ресурсов.

Но тогда вопрос, как там принудительно заставить файл сброситься на диск и высвободить все ресурсы.
Старый 10.03.2020, 10:21   #5  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
Если запись происходит на файловое хранилище и под разными пользователями (под кем запускается AOS, отличается под кем крутится скрипт), то это нормальное поведение с файлами.
__________________
Любую техническую проблему можно решить, если есть достаточно времени и денег.
Старый 10.03.2020, 10:29   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от demianimp Посмотреть сообщение
Если запись происходит на файловое хранилище и под разными пользователями (под кем запускается AOS, отличается под кем крутится скрипт), ...
Нет, все происходит под учеткой аоса.
Фишка в том что скрипт питона запущенный из под аоса отработал, а результат не увидел. Он ему доступен через некоторое время.

Цитата:
Сообщение от demianimp Посмотреть сообщение
...то это нормальное поведение с файлами.
Правда ? Это почему ?
Старый 10.03.2020, 10:56   #7  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
Цитата:
Сообщение от Logger Посмотреть сообщение
Правда ? Это почему ?
Ссылка

Из статьи:
Цитата:
Дело в том, что в версии SMB v2.x, представленном в Windows 2008 / Vista (см. таблицу с версиями протокола SMB) для уменьшения трафика и количества SMB запросов между SMB-клиентом и сервером, и ускорения доступа к общим папкам и файлам по сети стал использоваться механизм кэширования (это дает ощутимый эффект при доступе к сетевой папке через медленный канал или канал с большими задержками). Таким образом компонента Microsoft Redirector на компьютерах пользователей использует локальный кэш с метаданными сетевого каталога. По умолчанию этот кэш очищается каждые 10 секунд.
__________________
Любую техническую проблему можно решить, если есть достаточно времени и денег.
За это сообщение автора поблагодарили: Logger (3).
Старый 10.03.2020, 11:18   #8  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Интересно.
Но у нас не тот случай. Юзер один. Папка - локальный темп.
Старый 10.03.2020, 14:35   #9  
Alexius is offline
Alexius
Участник
Аватар для Alexius
 
461 / 248 (9) ++++++
Регистрация: 13.12.2001
А отключение индексации файлов на сервере (Windows Search) не помогает ?
Старый 10.03.2020, 16:14   #10  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
А служба Windows Search не установлена.
Старый 10.03.2020, 20:11   #11  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
А проблема именно в питоне ? Просто в ShellExecute явного высвобождения дескриптора не происходит, что если добавить явный вызов CloseHandlе в конце метода ?

Или, например, вместо ShellExecute, использовать функцию CreateProcess ?

https://stackoverflow.com/questions/...execute-to-run
__________________
Sergey Nefedov
Старый 11.03.2020, 17:47   #12  
vmoskalenko is offline
vmoskalenko
Участник
Аватар для vmoskalenko
 
145 / 334 (12) ++++++
Регистрация: 25.01.2007
Адрес: Toronto
Я предложу альтернативное решение.

два батча джоба
#1. Делает экспорт из БД файликов. Имя файлика == RecId (Ну или как удобней будет для уникальной идентификации файлика к записи)
Выполняет экспорт пачками по 100-1000 файликов за один раз
Надо добавить чтобы он помечал запись как выгруженную, чтобы ее повторно не экспортировать.

Питон смотрит на файловую папку inbound. Делает свою магию и складывает сконверченные картинки в папку outbound. Те которые не надо конвертить - удаляет. Из inbound тоже удаляет после обработки.

#2. Батч которые время от времени сканирует папку outbound. Если файлики есть, то забирает их к себе в БД. Файлики удаляет.
Теги
ax2012, ax4.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
2009 AX, Вставка в grid нескольких изображений Mutnyi DAX: Программирование 17 17.09.2014 15:51
Обработка изображений в аксапте 3.0 sobik DAX: Программирование 1 13.07.2011 13:22
Обработка входящего НДС andrw DAX: Функционал 12 05.03.2008 11:35
Висит обработка фактуры Pavel8338 DAX: Администрирование 12 12.01.2006 13:10
Суммарная обработка накладной AlexUnik DAX: Функционал 1 19.08.2004 15:51

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:02.