У меня есть таблица SQL Server с ~ 300 000 000 абсолютных UNC-путей, и я пытаюсь (быстро) проверить их, чтобы убедиться, что путь в таблице SQL Server фактически существует как файл на диске.
При значении лица я запрашиваю таблицу в партиях по 50 000 и увеличиваю счетчик, чтобы продвигать свою партию, когда я иду.
Затем я использую объект для чтения данных для хранения текущего набора пакетов и цикла через пакет, проверяя каждый файл командой File.Exists(path)
, как в следующем примере.
Проблема в том, что я обрабатываю прибл. 1000 файлов в секунду максимум на четырехъядерном ядре 3.4ghz i5 с 16-гигабайтным барабаном, который займет несколько дней. Есть ли более быстрый способ сделать это?
У меня есть индекс columnstore в таблице SQL Server, и я профилировал его. Я получаю пакеты из 50 тыс. Записей в < 1s, поэтому это не узкое место SQL при выпуске пакетов в консольное приложение .net.
while (counter <= MaxRowNum)
{
command.CommandText = "SELECT id, dbname, location FROM table where ID BETWEEN " + counter + " AND " + (counter+50000).ToString();
connection.Open();
using (var reader = command.ExecuteReader())
{
var indexOfColumn1 = reader.GetOrdinal("ID");
var indexOfColumn2 = reader.GetOrdinal("dbname");
var indexOfColumn3 = reader.GetOrdinal("location");
while (reader.Read())
{
var ID = reader.GetValue(indexOfColumn1);
var DBName = reader.GetValue(indexOfColumn2);
var Location = reader.GetValue(indexOfColumn3);
if (!File.Exists(@Location.ToString()))
{
//log entry to logging table
}
}
}
// increment counter to grab next batch
counter += 50000;
// report on progress, I realize this might be off and should be incremented based on ID
Console.WriteLine("Last Record Processed: " + counter.ToString());
connection.Close();
}
Console.WriteLine("Done");
Console.Read();
EDIT: добавление дополнительной информации:
думал об этом все через саму базу; это серверное предприятие sql с 2tb оперативной памяти и 64 ядрами. Проблема заключается в том, что учетная запись службы sql-сервера не имеет доступа к путям nas, на которых размещаются данные, поэтому моя cmdshell работает через SP с ошибкой (я не контролирую материал AD), а UNC-пути имеют сотни тысяч отдельных подсетей каталоги на основе хеша MD5 файла. Таким образом, перечисление содержимого каталогов не будет полезным, потому что у вас может быть файл 10 каталогов, в котором находится только 1 файл. Вот почему я должен выполнить буквальный полный путь/проверить.
О, и пути очень длинные вообще. Я фактически попробовал загрузить их все в список в памяти, прежде чем я понял, что это эквивалент 90gb данных (lol, oops). Полностью согласен с другими комментариями по его разметке. База данных очень быстро, не беспокоится вообще. Если бы не рассматривалась болтовня SMB, это очень хорошо, возможно, это то, с чем я столкнулся. - JRats 13 часов назад
О! И я также обновляю базу данных только в том случае, если файл не существует. Если это произойдет, мне все равно. Таким образом, мои работы базы данных сводятся к минимуму, чтобы захватить партии путей. В принципе, мы перенесли кучу данных из более медленного хранилища в это проворное устройство, и меня попросили убедиться, что все на самом деле закончило это, написав что-то, чтобы проверить существование на файл.
Threading помог совсем немного. Я включил проверку файлов на 4 потока и получил мощность обработки до 3300 записей в секунду, что намного лучше, но я все еще надеюсь получить еще быстрее, если смогу. Есть ли хороший способ узнать, связан ли я с трафиком SMB? Я заметил, как только я попытался увеличить количество потоков до 4 или 5, моя скорость упала до струйки; Я думал, может быть, я где-то зашел в тупик, но нет.
О, и я не могу выполнить проверку FileOnNetwork по той причине, о которой вы сказали, там 3 или 4 раза больше файлов, размещенных там по сравнению с тем, что я хочу проверить. На этом проворном устройстве, вероятно, есть 1.5b файлов.