I like to move it, move it (вопрос про копирование файлов)

User avatar
RGoo
Уже с Приветом
Posts: 1917
Joined: 08 Jul 2003 17:42
Location: Canada

I like to move it, move it (вопрос про копирование файлов)

Post by RGoo »

Добрый день,
есть задачка, требуется помощь зала.
Дано:
есть существующий софт (Java), который следит за поступлением файлов во входящюю папку.
По приходу - смотрит в базе (Oracle) на предмет правильности файла (маска имени), берет из базы список папок куда копировать (более одной) и начинает копировать.
Но так как это Java, программа сделана в Fujitsu, то оно делает отдельную копию Java-объекта в памяти на каждый файл\папку. В итоге для 300 файлов по 100 байт (!) каждый, каждый из которых надо скопировать в 3 папки, оно создало 900 объектов, сожрало всю память и помре. С производительностю тоже швах - среднее время выполнения - 20 секунд на операцию, при среднем размре файла 1кб.
Все крутится на *nix платформе.
Нужно:
Альтернатива. Условия - производительность, простота настройки и возможность отследить (получить запись в базу) как при удачно завершенном копировании так и в случае возникновения ошибки в процесее _для каждого файла_ и _папки_ отдельно, минимум телодвижений для достижения цели ("переписать Java код" не пойдет).
Первая мысль была - тупо нагенерить кучу .sh скриптов (для всех масок имен и папок из базы данных) и запускать их из awk (я не совсем понимаю пока как можно запустить процесс на *nix по прибытию файла в папку, изучаю вопрос). Маски\папки меняются не так часто, при измении можно просто все перегенировать заново.
Однако мне кажется что изобретаю велосипед. Гугл ничего особого не дал, кроме как варианта с ant.
Какие есть еще варианты?
Спасибо.
Дочки rulezzz !
helg
Уже с Приветом
Posts: 4827
Joined: 15 May 2001 09:01

Re: I like to move it, move it (вопрос про копирование файлов)

Post by helg »

Нужно оперативно перенести триста коробок. В одиночку - долго. На 300 работников в комнатах не хватает места. Как бы Вы это сорганизовали?

Вот и в Java это делается точно таким же образом.

Да, а копирователь для каждого нового файла устанавливает новое соединение к базе?
mskmel
Уже с Приветом
Posts: 946
Joined: 24 Sep 2013 05:58
Location: US\GA

Re: I like to move it, move it (вопрос про копирование файлов)

Post by mskmel »

Позовите того, кто умеет писать на shell, тут несложной работы на 20-60 минут с кофе :)
User avatar
Slonjra
Уже с Приветом
Posts: 6677
Joined: 02 Sep 2003 15:19
Location: Через речку от Манхэттена

Re: I like to move it, move it (вопрос про копирование файлов)

Post by Slonjra »

вообщем то у меня тоже была такая же мысль. Зачем тут Джава и Оракл, если можно обойтись скриптами.
Под виндами я бы такое делал на PowerShell. Думаю и под .nix есть что-то подобное.

к тому же (если позволяют условия задачи) , то раз у вас масок немного, то я бы и цикл делал по маскам, а не по файлам.
берем первую маску, и все что под нее подходит - копируем нужное место...если надо то еще раз в другое место..итд
но это зависит от того, как часто у вас прибывают новые файлы..
Last edited by Slonjra on 22 Oct 2015 18:51, edited 1 time in total.
Резюме — это список дел, которые ты больше никогда не хочешь делать.
iDesperado
Уже с Приветом
Posts: 1349
Joined: 28 Nov 2008 17:50

Re: I like to move it, move it (вопрос про копирование файлов)

Post by iDesperado »

у нас туча кода на оракле, шедулер по расписанию проверяет папки и подключает скопированые файлы к extrnal tables, с которых инсерты идут в в базу, потом с оракла же рассылаются майлы. но кода дофигища.
еще на корпортивном уровне слышал webmethods для гоняний файлов используют
User avatar
RGoo
Уже с Приветом
Posts: 1917
Joined: 08 Jul 2003 17:42
Location: Canada

Re: I like to move it, move it (вопрос про копирование файлов)

Post by RGoo »

Slonjra wrote: к тому же (если позволяют условия задачи) , то раз у вас масок немного, то я бы и цикл делал по маскам, а не по файлам.
Спасибо, я к этому и склоняюсь (скрипт).
Хотелось увидеть - есть ли альтернативы.
Дочки rulezzz !
User avatar
RGoo
Уже с Приветом
Posts: 1917
Joined: 08 Jul 2003 17:42
Location: Canada

Re: I like to move it, move it (вопрос про копирование файлов)

Post by RGoo »

iDesperado wrote:у нас туча кода на оракле...но кода дофигища.
Я уже прикинул объем кода для аналогичного решения и понял что это не вариант.
iDesperado wrote: еще на корпортивном уровне слышал webmethods для гоняний файлов используют
Спасибо, буду гуглить.
Дочки rulezzz !
User avatar
RGoo
Уже с Приветом
Posts: 1917
Joined: 08 Jul 2003 17:42
Location: Canada

Re: I like to move it, move it (вопрос про копирование файлов)

Post by RGoo »

helg wrote:Нужно оперативно перенести триста коробок. В одиночку - долго. На 300 работников в комнатах не хватает места. Как бы Вы это сорганизовали?
Вот и в Java это делается точно таким же образом.
Прежде чем что-либо организовывать - я читаю условие задачи.
А там было: "переписать Java код" не пойдет.
Кроме того, в чем проблема текущего кода на Яве и так понятно.
Ищется альтернатива.
helg wrote:Да, а копирователь для каждого нового файла устанавливает новое соединение к базе?
Да. И за это гуано заплачены мучо динарес.
Дочки rulezzz !
helg
Уже с Приветом
Posts: 4827
Joined: 15 May 2001 09:01

Re: I like to move it, move it (вопрос про копирование файлов)

Post by helg »

Итак. Описание проблемы по пунктам. Правильное?
1. Монстр имени мучодинерос, который определяет наличие новых файлов в директории, не умеет вызывать внешние компоненты внутри своего процесса. Он умеет только запускать новые процессы, передавая им необходимые параметры.
2. На каждый файл запускается экземпляр Java. На каждого террориста атомную бомбу. Дороговато.
3. Экземпляр Java, поскольку он каждый раз новый, делает новое соединение у Ораклу - а это секунд несколько только на рукопожатие.

- Переписывание кастом компонента на авкопитоноперловом скрипте решает проблему №2. Но №3 остаётся. Скрипт не живёт постоянно в памяти, поэтому не может держать постоянное соединение к базе. Поэтому время коннекта к базе добавляется к операции над каждым файлом.

Предлагается.

Написать простенький REST-подобный сервис на Java. Внутри томката или аналога. Сервис принимает запросы типа GET http://localhost/movefile/fromfolder/filename" onclick="window.open(this.href);return false; , сверяется с базой что с таким файлоом надлежит сделать - и делает указанное. При этом соединение с базой у него постоянное, c pool и всеми фишечками - так что сполняет он работу оперативно. И сидит в памяти один. При этом параллельные запросы он замечательно сполняет, посколько web-сервер на такое заточен изначально.

Внешний процесс, который Монстр Имени Мучодинерос запускает, - это лёгкий shell-скрипт, который из передаваемых ему параметров лепит URL для вышеупомянутого REST-сервиса, - и запускает wget /curl, дергая оный REST.
User avatar
Slonjra
Уже с Приветом
Posts: 6677
Joined: 02 Sep 2003 15:19
Location: Через речку от Манхэттена

Re: I like to move it, move it (вопрос про копирование файлов)

Post by Slonjra »

helg wrote:
- Переписывание кастом компонента на авкопитоноперловом скрипте решает проблему №2. Но №3 остаётся. Скрипт не живёт постоянно в памяти, поэтому не может держать постоянное соединение к базе. Поэтому время коннекта к базе добавляется к операции над каждым файлом.

.
Скрипту вообще не нужен Оракл. Там хранятся только маски и список фордеров, куда надо копировать.
По условиям задачи, их не так уж и много. Так что исключить вообще обращение к базе, и хранить эти списки или в скрипте, или в файле-конфиге.
Резюме — это список дел, которые ты больше никогда не хочешь делать.
helg
Уже с Приветом
Posts: 4827
Joined: 15 May 2001 09:01

Re: I like to move it, move it (вопрос про копирование файлов)

Post by helg »

Slonjra wrote:Скрипту вообще не нужен Оракл.
Раз не нужен, то конечно, лёгонький скрипт - и все дела. Возможно, я неправильно понял постановку задачи:
возможность отследить (получить запись в базу) как при удачно завершенном копировании так и в случае возникновения ошибки в процесее _для каждого файла_ и _папки_ отдельно
Я это понял, что статус завершения каждого отдельно акта копирования таки должен попадать в базу.
sergant
Уже с Приветом
Posts: 1127
Joined: 11 Apr 2004 03:28

Re: I like to move it, move it (вопрос про копирование файлов)

Post by sergant »

для затравки

Code: Select all

#!/bin/sh

MyCopy () {
    MASK=$1; shift
    for dir in $@; do
        for file in $MASK; do
            echo "cp $file $dir"
        done
    done
}   

MyCopy "*.sh" "dir1/" "dir2/" "dir3/"
MyCopy "*.c" "dir4/" "dir5/" "dir6/" "dir7/"
User avatar
RGoo
Уже с Приветом
Posts: 1917
Joined: 08 Jul 2003 17:42
Location: Canada

Re: I like to move it, move it (вопрос про копирование файлов)

Post by RGoo »

Спасибо всем, буду думать.
Не так много вариантов оказалось :).
Дочки rulezzz !
iDesperado
Уже с Приветом
Posts: 1349
Joined: 28 Nov 2008 17:50

Re: I like to move it, move it (вопрос про копирование файлов)

Post by iDesperado »

sergant wrote:для затравки

Code: Select all

#!/bin/sh

MyCopy () {
    MASK=$1; shift
    for dir in $@; do
        for file in $MASK; do
            echo "cp $file $dir"
        done
    done
}   

MyCopy "*.sh" "dir1/" "dir2/" "dir3/"
MyCopy "*.c" "dir4/" "dir5/" "dir6/" "dir7/"
халтура. где гарантия, что файлы не пойдут пережевывать до того как срикпт окончил копирование ? а если копирование сдохло по середине ? где мониторинг ? а в реальной жизни там еще уйма вещей понадобиться

Return to “Вопросы и новости IT”