Мозгоштурм: как обработать быстрее?

Ролг Хупин

Такая задача: Приложение получает из таблицы в базе список файлов, затем должно пройти по списку и определить - существует ли физически файл по указанному пути.Если не существует файл добавляется в список несуществующих файлов, который и является целью обработки.При большом количестве файлов в списке обработка длинная.Как можно распараллелить? ускорить?
24 ответа

Ролг Хупин

Ролг Хупин,В табле триггер на insert и проверять на данное событие. Будет мгновенно.


Ролг Хупин

Ролг Хупин,Неужели обработка быстрее поиска?Мне кажется всю задачу надо смотреть.Представим есть терабайт hdd. И зачем каждый раз по нему искать?


Ролг Хупин

Ролг Хупин,В табле триггер на insert и проверять на данное событие. Будет мгновенно.
Из базы только читается список файлов, далее всё делается в приложении.Если имеется в виду - в момент добавления файла в базу, то - да, можно и так, но после этого файл могли грохнуть и т.д.Там есть и обратная задача, но есть условие: из базы никаких выходов во внешний мир, т.к. Azure, RDS, SQL Server Linux


Ролг Хупин

Ролг Хупин,Если файл могли грохнуть, то никакие списки ЗАРАНЕЕ на клиенте делать нельзя.


Ролг Хупин

Там есть и обратная задача,
Если это какое то зеркало, то ваша задача шире какого то поиска файлов в операционке.


Ролг Хупин

Ролг Хупин,Если файл могли грохнуть, то никакие списки ЗАРАНЕЕ на клиенте делать нельзя.
Ну, это и не зеркало.Задача 1. В базу пишутся записи о прикладных объектах, каждый объект имеет список связанных с объектом файлов (путей).Объект О1-> ->Файл1 ->Файл2 ... ->ФайлNЮзер может проверить целостность набора файлов в клиентском приложении.Выбирается список из базы (Файл1,...,->Файл10000) и создается список несуществующих.Почему они уже не существуют - вопрос третий, да это и не важно.Задача 2. (Обратная)В функцию в приложении передается фолдер и нужно создать список файлов, которые есть в фолдере, но нет в таблице в базе.Эти задачи делаются, но при большом количестве файлов на диске и/или в базе - они тяжелые и долго выполняются, потому что линейно, по одной записи.


Ролг Хупин

Ролг Хупин,Вы мне рассказали решение. А я говорил о постановке. Т.е. почему файлы?...Если пропустить постановку, то давайте цифры про "тормозит"


Ролг Хупин

Ну, это и не зеркало
Да. Это Git хранилище со снимками


Ролг Хупин

Ролг Хупин,а сколько файлов? как долго выполняется?У нас админ тупо на PowerShell скрипт наваял и он шустро работает.9 с половиной миллионов файлов в 14 миллионах папок.


Ролг Хупин

Эти задачи делаются, но при большом количестве файлов на диске и/или в базе - они тяжелые и долго выполняются, потому что линейно, по одной записи.
Сиквел умеет хранить в базе файлы, но в виде ссылок? Как в оракле?Подходит вариант?


Ролг Хупин

Сиквел умеет хранить в базе файлы, но в виде ссылок? Как в оракле?Подходит вариант?
не ;-) там строчки nvarchar - пути к файлам.Как я написал "Приложение получает из таблицы в базе список файлов, затем должно пройти по списку и определить - существует ли физически файл по указанному пути.Если не существует файл добавляется в список несуществующих файлов, который и является целью обработки."Для большого списка проверка существования каждого файла - одно из узких мест.Ну, да, разве что запустить в несколько потоков проверку и если нет файла - добавление в тот же список.


Ролг Хупин

Ролг Хупин,а сколько файлов? как долго выполняется?У нас админ тупо на PowerShell скрипт наваял и он шустро работает.9 с половиной миллионов файлов в 14 миллионах папок.
Это у разных юзеров выполняется, по-разному может быть, где-то быстро, где-то несколько часов, если файлов много, если слабая машина, где запустили утилиту и т.д.Интерфейс должен быть юзер-френдли, потому PS не пройдет.


Ролг Хупин

Это у разных юзеров выполняется, по-разному может быть, где-то быстро, где-то несколько часов, если файлов много, если слабая машина, где запустили утилиту и т.д.Интерфейс должен быть юзер-френдли, потому PS не пройдет.
Несколько часов у юзера? Сомневаюсь, что у отдельного юзера миллионы файлов. Смотрите на чём конкретно тормозит Ваша обработка.LINQ используете?


Ролг Хупин

Для большого списка проверка существования каждого файла - одно из узких мест.
Это не конкретный текст.


Ролг Хупин

несколько потоков проверку
Головка HDD одна ))).Поэтому выкладывай инфу.


Ролг Хупин

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


Ролг Хупин

Несколько часов у юзера? Сомневаюсь, что у отдельного юзера миллионы файлов. Смотрите на чём конкретно тормозит Ваша обработка.LINQ используете?
Конечно, миллионов файлов нет, тыщи, LINQ тоже нет. Читается список в List, затем суётся в DGV , затем проверяется и формируется целевой список несуществующих во втором DGV. Код написан 300 лет назад


Ролг Хупин

Алексей К,Говорит что список машины может устареть)


Ролг Хупин

Головка HDD одна ))).
Он же не файлы будет читать, а содержимое папок. Виндовс эту инфу кэширует.


Ролг Хупин

Код написан 300 лет назад
Код написан 300 лет назад
Осталось написать TestFor 1000 toIf FileExist ("xxxxxxxEnd forИ сказать время.


Ролг Хупин

кэширует
Тут мы углубимся в кэш протух и твёрдотельные диски.


Ролг Хупин

Делай в N потоков.Как вариант: если папок с файлами немного, то сначала прочитать содержимое папок в массив, затем проверять на наличие в массиве.


Ролг Хупин

Делай в N потоков.Как вариант: если папок с файлами немного, то сначала прочитать содержимое папок в массив, затем проверять на наличие в массиве.
да, вариант, хоть в общем случае неизвестно много ли файлов.Но вот "наличие в массиве" как проверять? Перебором?Там ключ по идее полный путь к файлу.


Ролг Хупин

Но вот "наличие в массиве" как проверять? Перебором?
Зачем перебором? Отсортируй и бинарным поиском. Или HashSet возьми вместо массива.
Там ключ по идее полный путь к файлу.
В массив тоже пиши имя с полным путем.