|
|
|
Конкурирующие процессы
|
|||
|---|---|---|---|
|
#18+
Всем доброго времени суток! Имеется таблица, которая содержит пути к файлам. Все пути к файлам уникальные, но данные в самих файлах могут быть одинаковыми. Программа должна обработать данные файлов, пути к которым содержатся в таблице. При этом, нельзя обрабатывать одинаковые данные в файлах повторно. Надо учесть то, что сама программа разбита на несколько параллельно работающих процессов (число порцессов динамически меняется в ходе работы программы). Хотелось бы узнать менние народа по поводу решения задачи. Возможно, есть стандартные алгоритмы, и не придётся изобретать велосипед. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2009, 10:28:24 |
|
||
|
Конкурирующие процессы
|
|||
|---|---|---|---|
|
#18+
f00GassПри этом, нельзя обрабатывать одинаковые данные в файлах повторно. Как это? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2009, 10:52:51 |
|
||
|
Конкурирующие процессы
|
|||
|---|---|---|---|
|
#18+
f00Gass, если имеется строгий запрет на обработку одинаковых файлов, то, помимо CRC или хеша в качестве ключа, нужен дополнительный анализ данных. Если в самих данных есть такая уникальная часть, то ее и нужно делать характеризующим файлы ключем. Вариант простой - делаешь разделяемую между процессами таблицу с характеризующим ключем, полем, информирующем о стадиях обработки и поле с планируемым временем завершения обработки. Кто их процессов первый начинает транзакцию вставкой записи с ключем, тот и обрабатывает(если быстро, то можно в той же транзакции, тогда кроме ключа может и не понадобиться других полей). Нужно еще предусмотреть сбойные ситуации, когда данные длительной обработки, и процесс, который вставил запись, аварийно завершен. Тогда периодическая чистка должна проверять окончание обработок по стадии и времени обработки. Если все обработки выполняется внутри одного сервера MSSQL, то можно использовать sp_getapplock...sp_releaseapplock для замыкания по характеризующему файлы ключу вместо "родных" транзакций ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2009, 11:14:21 |
|
||
|
Конкурирующие процессы
|
|||
|---|---|---|---|
|
#18+
maytonf00GassПри этом, нельзя обрабатывать одинаковые данные в файлах повторно. Как это? Объясню на примере, думаю, так будет намного быстрее. Пусть в таблице имеются следующие пути к файлам /some/path/file1 и /some/path/file2 . Положим, что данные в этих файлах полностью одинаковые. Так вот, если хотя бы один процесс обработал данные одного из этих файлов, то никакой процесс больше не должен обрабатывать данные файла ни /some/path/file1, ни /some/path/file2 . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2009, 11:14:57 |
|
||
|
Конкурирующие процессы
|
|||
|---|---|---|---|
|
#18+
Данные, которые лежат в файлах должны ложится в таблицу с констрейнтом уникальности. При повторной загрузке ты обрабатываешь Exception и игнорируешь дубликаты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2009, 11:17:43 |
|
||
|
Конкурирующие процессы
|
|||
|---|---|---|---|
|
#18+
vinoКто их процессов первый начинает транзакцию вставкой записи с ключем, тот и обрабатывает В этом варианте может быть такая ситуация, если я правильно поинимаю: Один процесс вставляет запись с некоторым ункальным ключём, другой процесс тоже пытается это сделать с таким же ключём. Но кто-то из них в итоге получит исключение. Такой вариант крайне нежелателен, он рассматривается как крайняя мера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2009, 11:28:10 |
|
||
|
Конкурирующие процессы
|
|||
|---|---|---|---|
|
#18+
maytonДанные, которые лежат в файлах должны ложится в таблицу с констрейнтом уникальности. При повторной загрузке ты обрабатываешь Exception и игнорируешь дубликаты. Да, это первое, что приходит в голову. Надеюсь, можно решить задачу с помощью логики без исключений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2009, 11:38:15 |
|
||
|
Конкурирующие процессы
|
|||
|---|---|---|---|
|
#18+
Если иметь больше информации о природе загружаемых данных - можно было-бы гарантировать уникальность другим способом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2009, 12:01:42 |
|
||
|
Конкурирующие процессы
|
|||
|---|---|---|---|
|
#18+
f00Gass, конкурирующая логика работы всегда такая, что проще обработать исключение уникальности или таймаута, чем городить свою "логику". Хотя бы платформу уточни, и на скольки серверах должна выполняться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2009, 16:18:24 |
|
||
|
Конкурирующие процессы
|
|||
|---|---|---|---|
|
#18+
vino, Да, согласен, дело - дрянь. Вся работа пока на одном сервере, но никто не отрицает, что в будущем будет на нескольких. Как пока не крути, выходит, что самый подходящий вариант через исключения. Хотя, ещё рассматривается вариант с "промежуточным звеном". Предполагается, что это самое звено будет работать в монопольном режиме и постоянно проверять таблицу на предмет новых поступлений. И если новые поступления есть, то будет высчитывать CRC для файла; далее в случае отсутствия файла с таким CRC, будет добавлять запись в результирующую таблицу (с которой будут работать обработчики). Т.к. высчитать CRC намноооого быстре чем обработать содержимое в файлах, то на данном этапе вариант вполне приемлим. Разумеется данный подход в последствии может сильно сказаться на масштабируемости проекта. P.S.: О.С. - Linux, Б.Д. - MySQL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2009, 09:53:49 |
|
||
|
Конкурирующие процессы
|
|||
|---|---|---|---|
|
#18+
Я встречал много промышленных систем, в которых, загрузка данных в базу происходила непосредственно, и без проверок. А потом, в БД стартовали процессы, которые выполняли чистку данных. Например для протоколов телефонных станций - это отсеивание несуществующего траффика, служебного, транзитного и т.п. Что-бы решать, где фильтровать удобнее, на клиенте или на сервере, нужны количественные оценки. Во сколько раз, и с какими расходами, где лучше вычислять. На мой взгляд в БД это делать удобнее, особенно если процент "битых" данных невелик. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2009, 10:01:20 |
|
||
|
Конкурирующие процессы
|
|||
|---|---|---|---|
|
#18+
maytonНа мой взгляд в БД это делать удобнее, особенно если процент "битых" данных невелик. В том то и оно, что процент "битых" данных составляет примерно 90%, и этого никак не избежать :\ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2009, 11:17:04 |
|
||
|
Конкурирующие процессы
|
|||
|---|---|---|---|
|
#18+
А откуда такие данных приходят? Что у вас, работа между подразделениями настолько несогласована? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2009, 11:21:28 |
|
||
|
Конкурирующие процессы
|
|||
|---|---|---|---|
|
#18+
mayton, Эти данные - результат обхода спайдерами различных web-сайтов. Сейчас, планируется убрать из раздачи множество дублекатов, для разгрузки поискового индекса, снижения затрат на поиск, и, разумеется, ещё есть маленькая надежда на то, что найти нужную информацию станет легче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2009, 11:46:00 |
|
||
|
Конкурирующие процессы
|
|||
|---|---|---|---|
|
#18+
f00Gassmayton, Эти данные - результат обхода спайдерами различных web-сайтов. Сейчас, планируется убрать из раздачи множество дублекатов, для разгрузки поискового индекса, снижения затрат на поиск, и, разумеется, ещё есть маленькая надежда на то, что найти нужную информацию станет легче. Сделайте, чтобы они не обрабатывали по 10 раз один сайт, и все дела. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2009, 12:51:51 |
|
||
|
Конкурирующие процессы
|
|||
|---|---|---|---|
|
#18+
XDiaBLo, Дуплицируется информация на разных сайтах. Проблем с тем, что один сайт обрабатывается несколько раз нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2009, 13:02:43 |
|
||
|
Конкурирующие процессы
|
|||
|---|---|---|---|
|
#18+
f00GassXDiaBLo, Дуплицируется информация на разных сайтах. Проблем с тем, что один сайт обрабатывается несколько раз нет. Ну она не на 100% одинаковая, файлы с данными получатся немного разные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2009, 13:07:56 |
|
||
|
Конкурирующие процессы
|
|||
|---|---|---|---|
|
#18+
XDiaBLo, С каждой страницы берётся только нужная информация, совпадение получается стопроцентным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2009, 13:31:57 |
|
||
|
Конкурирующие процессы
|
|||
|---|---|---|---|
|
#18+
f00GassXDiaBLo, С каждой страницы берётся только нужная информация, совпадение получается стопроцентным. Фактически, это задача поиска дубликатов, а там наибольшая обработка-то как раз заключается в получении слепка (например, подсчет к-нибудь хеша для характеризующего ключа + размер файлов в Вашем случае) чтобы сравнивать сущности. Но здесь всегда были подводные камни при отбрасывании несущественных изменений (например, лишние пробелы в тексте, комментарии MP3 тегах) - в Вашем случае, судя по цитате, этим спайдеры занимаются ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2009, 15:03:15 |
|
||
|
Конкурирующие процессы
|
|||
|---|---|---|---|
|
#18+
Является - ли дублирование критичным? Если вы делаете поисковой сервер для интернета, то он имеет полное право найти искомую информацию сразу в нескольких источниках. Иногда это даже удобно. Какой-то примитивный вариант отказоустойчивости. Тоесть я хочу сказать, что наличие реплик и дубликатов в глобальной сети - нормальное явление и относится к нему надо терпимо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2009, 15:10:45 |
|
||
|
Конкурирующие процессы
|
|||
|---|---|---|---|
|
#18+
mayton, В этом сервисе, к сожалению, дублирование информации абсолютно неприемлимо. Итак, можно подвести итог суточного обсуждения. Если я праивльно поянл то, призёром в наимнации "мнение народна", становится алгоритм основанный на обработке исключений. Всем, огрмное спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2009, 15:38:05 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=35930571&tid=1344544]: |
0ms |
get settings: |
8ms |
get forum list: |
22ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
189ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
81ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 531ms |

| 0 / 0 |
