I like to move it, move it (вопрос про копирование файлов)
-
- Уже с Приветом
- Posts: 1917
- Joined: 08 Jul 2003 17:42
- Location: Canada
I like to move it, move it (вопрос про копирование файлов)
Добрый день,
есть задачка, требуется помощь зала.
Дано:
есть существующий софт (Java), который следит за поступлением файлов во входящюю папку.
По приходу - смотрит в базе (Oracle) на предмет правильности файла (маска имени), берет из базы список папок куда копировать (более одной) и начинает копировать.
Но так как это Java, программа сделана в Fujitsu, то оно делает отдельную копию Java-объекта в памяти на каждый файл\папку. В итоге для 300 файлов по 100 байт (!) каждый, каждый из которых надо скопировать в 3 папки, оно создало 900 объектов, сожрало всю память и помре. С производительностю тоже швах - среднее время выполнения - 20 секунд на операцию, при среднем размре файла 1кб.
Все крутится на *nix платформе.
Нужно:
Альтернатива. Условия - производительность, простота настройки и возможность отследить (получить запись в базу) как при удачно завершенном копировании так и в случае возникновения ошибки в процесее _для каждого файла_ и _папки_ отдельно, минимум телодвижений для достижения цели ("переписать Java код" не пойдет).
Первая мысль была - тупо нагенерить кучу .sh скриптов (для всех масок имен и папок из базы данных) и запускать их из awk (я не совсем понимаю пока как можно запустить процесс на *nix по прибытию файла в папку, изучаю вопрос). Маски\папки меняются не так часто, при измении можно просто все перегенировать заново.
Однако мне кажется что изобретаю велосипед. Гугл ничего особого не дал, кроме как варианта с ant.
Какие есть еще варианты?
Спасибо.
есть задачка, требуется помощь зала.
Дано:
есть существующий софт (Java), который следит за поступлением файлов во входящюю папку.
По приходу - смотрит в базе (Oracle) на предмет правильности файла (маска имени), берет из базы список папок куда копировать (более одной) и начинает копировать.
Но так как это Java, программа сделана в Fujitsu, то оно делает отдельную копию Java-объекта в памяти на каждый файл\папку. В итоге для 300 файлов по 100 байт (!) каждый, каждый из которых надо скопировать в 3 папки, оно создало 900 объектов, сожрало всю память и помре. С производительностю тоже швах - среднее время выполнения - 20 секунд на операцию, при среднем размре файла 1кб.
Все крутится на *nix платформе.
Нужно:
Альтернатива. Условия - производительность, простота настройки и возможность отследить (получить запись в базу) как при удачно завершенном копировании так и в случае возникновения ошибки в процесее _для каждого файла_ и _папки_ отдельно, минимум телодвижений для достижения цели ("переписать Java код" не пойдет).
Первая мысль была - тупо нагенерить кучу .sh скриптов (для всех масок имен и папок из базы данных) и запускать их из awk (я не совсем понимаю пока как можно запустить процесс на *nix по прибытию файла в папку, изучаю вопрос). Маски\папки меняются не так часто, при измении можно просто все перегенировать заново.
Однако мне кажется что изобретаю велосипед. Гугл ничего особого не дал, кроме как варианта с ant.
Какие есть еще варианты?
Спасибо.
Дочки rulezzz !
-
- Уже с Приветом
- Posts: 4827
- Joined: 15 May 2001 09:01
Re: I like to move it, move it (вопрос про копирование файлов)
Нужно оперативно перенести триста коробок. В одиночку - долго. На 300 работников в комнатах не хватает места. Как бы Вы это сорганизовали?
Вот и в Java это делается точно таким же образом.
Да, а копирователь для каждого нового файла устанавливает новое соединение к базе?
Вот и в Java это делается точно таким же образом.
Да, а копирователь для каждого нового файла устанавливает новое соединение к базе?
-
- Уже с Приветом
- Posts: 946
- Joined: 24 Sep 2013 05:58
- Location: US\GA
Re: I like to move it, move it (вопрос про копирование файлов)
Позовите того, кто умеет писать на shell, тут несложной работы на 20-60 минут с кофе
-
- Уже с Приветом
- Posts: 6677
- Joined: 02 Sep 2003 15:19
- Location: Через речку от Манхэттена
Re: I like to move it, move it (вопрос про копирование файлов)
вообщем то у меня тоже была такая же мысль. Зачем тут Джава и Оракл, если можно обойтись скриптами.
Под виндами я бы такое делал на PowerShell. Думаю и под .nix есть что-то подобное.
к тому же (если позволяют условия задачи) , то раз у вас масок немного, то я бы и цикл делал по маскам, а не по файлам.
берем первую маску, и все что под нее подходит - копируем нужное место...если надо то еще раз в другое место..итд
но это зависит от того, как часто у вас прибывают новые файлы..
Под виндами я бы такое делал на PowerShell. Думаю и под .nix есть что-то подобное.
к тому же (если позволяют условия задачи) , то раз у вас масок немного, то я бы и цикл делал по маскам, а не по файлам.
берем первую маску, и все что под нее подходит - копируем нужное место...если надо то еще раз в другое место..итд
но это зависит от того, как часто у вас прибывают новые файлы..
Last edited by Slonjra on 22 Oct 2015 18:51, edited 1 time in total.
Резюме — это список дел, которые ты больше никогда не хочешь делать.
-
- Уже с Приветом
- Posts: 1349
- Joined: 28 Nov 2008 17:50
Re: I like to move it, move it (вопрос про копирование файлов)
у нас туча кода на оракле, шедулер по расписанию проверяет папки и подключает скопированые файлы к extrnal tables, с которых инсерты идут в в базу, потом с оракла же рассылаются майлы. но кода дофигища.
еще на корпортивном уровне слышал webmethods для гоняний файлов используют
еще на корпортивном уровне слышал webmethods для гоняний файлов используют
-
- Уже с Приветом
- Posts: 1917
- Joined: 08 Jul 2003 17:42
- Location: Canada
Re: I like to move it, move it (вопрос про копирование файлов)
Спасибо, я к этому и склоняюсь (скрипт).Slonjra wrote: к тому же (если позволяют условия задачи) , то раз у вас масок немного, то я бы и цикл делал по маскам, а не по файлам.
Хотелось увидеть - есть ли альтернативы.
Дочки rulezzz !
-
- Уже с Приветом
- Posts: 1917
- Joined: 08 Jul 2003 17:42
- Location: Canada
Re: I like to move it, move it (вопрос про копирование файлов)
Я уже прикинул объем кода для аналогичного решения и понял что это не вариант.iDesperado wrote:у нас туча кода на оракле...но кода дофигища.
Спасибо, буду гуглить.iDesperado wrote: еще на корпортивном уровне слышал webmethods для гоняний файлов используют
Дочки rulezzz !
-
- Уже с Приветом
- Posts: 1917
- Joined: 08 Jul 2003 17:42
- Location: Canada
Re: I like to move it, move it (вопрос про копирование файлов)
Прежде чем что-либо организовывать - я читаю условие задачи.helg wrote:Нужно оперативно перенести триста коробок. В одиночку - долго. На 300 работников в комнатах не хватает места. Как бы Вы это сорганизовали?
Вот и в Java это делается точно таким же образом.
А там было: "переписать Java код" не пойдет.
Кроме того, в чем проблема текущего кода на Яве и так понятно.
Ищется альтернатива.
Да. И за это гуано заплачены мучо динарес.helg wrote:Да, а копирователь для каждого нового файла устанавливает новое соединение к базе?
Дочки rulezzz !
-
- Уже с Приветом
- Posts: 4827
- Joined: 15 May 2001 09:01
Re: I like to move it, move it (вопрос про копирование файлов)
Итак. Описание проблемы по пунктам. Правильное?
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.
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.
-
- Уже с Приветом
- Posts: 6677
- Joined: 02 Sep 2003 15:19
- Location: Через речку от Манхэттена
Re: I like to move it, move it (вопрос про копирование файлов)
Скрипту вообще не нужен Оракл. Там хранятся только маски и список фордеров, куда надо копировать.helg wrote:
- Переписывание кастом компонента на авкопитоноперловом скрипте решает проблему №2. Но №3 остаётся. Скрипт не живёт постоянно в памяти, поэтому не может держать постоянное соединение к базе. Поэтому время коннекта к базе добавляется к операции над каждым файлом.
.
По условиям задачи, их не так уж и много. Так что исключить вообще обращение к базе, и хранить эти списки или в скрипте, или в файле-конфиге.
Резюме — это список дел, которые ты больше никогда не хочешь делать.
-
- Уже с Приветом
- Posts: 4827
- Joined: 15 May 2001 09:01
Re: I like to move it, move it (вопрос про копирование файлов)
Раз не нужен, то конечно, лёгонький скрипт - и все дела. Возможно, я неправильно понял постановку задачи:Slonjra wrote:Скрипту вообще не нужен Оракл.
Я это понял, что статус завершения каждого отдельно акта копирования таки должен попадать в базу.возможность отследить (получить запись в базу) как при удачно завершенном копировании так и в случае возникновения ошибки в процесее _для каждого файла_ и _папки_ отдельно
-
- Уже с Приветом
- Posts: 1127
- Joined: 11 Apr 2004 03:28
Re: I like to move it, move it (вопрос про копирование файлов)
для затравки
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/"
-
- Уже с Приветом
- Posts: 1917
- Joined: 08 Jul 2003 17:42
- Location: Canada
Re: I like to move it, move it (вопрос про копирование файлов)
Спасибо всем, буду думать.
Не так много вариантов оказалось .
Не так много вариантов оказалось .
Дочки rulezzz !
-
- Уже с Приветом
- Posts: 1349
- Joined: 28 Nov 2008 17:50
Re: I like to move it, move it (вопрос про копирование файлов)
халтура. где гарантия, что файлы не пойдут пережевывать до того как срикпт окончил копирование ? а если копирование сдохло по середине ? где мониторинг ? а в реальной жизни там еще уйма вещей понадобиться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/"