Как сделать быстрее чтение списка файлов?

Ролг Хупин

Задача: взять списко файлов из указанного фолдера и заполнить им таблицу в базе.Для примера - SQLite.Делаю так:
// выбираю из файловой системы в массив

 string[] array1= Directory.GetFiles(path, @"*.*", includeSubdirs ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);

// пишу из массива в базу
using (var cmd = new SQLiteCommand(_sqlite))
 {
 using (var transaction = _sqlite.BeginTransaction())
 {
 SQLiteParameter par3 = new SQLiteParameter("@pfilename", DbType.String, 2048);
 cmd.Parameters.Add(par3);
 cmd.Prepare();
 cmd.CommandText = @"INSERT INTO files (filename,hash) SELECT @pfilename,Sha1(@pfilename);";

 foreach (var fname in array1)
 {
 par3.Value = fname;
 cmd.ExecuteNonQuery();
 }

 transaction.Commit();
 }
 }
Но смущает заполнение сначала массива, а потом переливание из массива в базу.Может можно без промежуточного массива обойтись? И время, и память сэкономится
7 ответов

Ролг Хупин

Может можно без промежуточного массива обойтись? И время, и память сэкономится
Что экономить-то? Тогда уж отказывайтесь от Directory.GetFiles это корень зла - породитель массива


Ролг Хупин

Что экономить-то? Тогда уж отказывайтесь от Directory.GetFiles это корень зла - породитель массива
Чем заменить?Кстати, да, есть такая еще проблема:когда даю параметр, например, взять список файлов со всего диска "d:\", то получаю исключение на "System Volume Information" - нет прав.Как получить список файлов со всего диска, исключая этот системный фолдер ?


Ролг Хупин

Но смущает заполнение сначала массива, а потом переливание из массива в базу.Может можно без промежуточного массива обойтись? И время, и память сэкономится
С говна сметану собираешь. Накладные расходы на это на порядок-два меньше, чем расходы на вызов одной команды сервера. А этих вызовов - столько же, сколько и файлов.Лучше подумай, как получить список файлов в самом сервере. Не знаю, как в SQLite, в MS SQL Server можно сделать что-то типа:
SELECT * FROM (execute cmd_exec("dir c:\folder /b")) INTO Table
давно этим не занимался, точный синтаксис не помню, но суть понятна: сервер выполнял команду, данные возвращались в виде списка строк, список строк идёт в таблицу. Всё делается за один вызов.


Ролг Хупин

С говна сметану собираешь. Накладные расходы на это на порядок-два меньше, чем расходы на вызов одной команды сервера. А этих вызовов - столько же, сколько и файлов.Лучше подумай, как получить список файлов в самом сервере. Не знаю, как в SQLite, в MS SQL Server можно сделать что-то типа:
SELECT * FROM (execute cmd_exec("dir c:\folder /b")) INTO Table
давно этим не занимался, точный синтаксис не помню, но суть понятна: сервер выполнял команду, данные возвращались в виде списка строк, список строк идёт в таблицу. Всё делается за один вызов.
В SQLite можно сделать расширение, но он будет в клиенте, так что шило на мыло...Я потому и долбусь на клиенте, что такие команды не допускаются, например, если сервер в туче.


Ролг Хупин

Ролг Хупин, прежде чем чинить слабое место - сначала найди его. Т.е. профильнись.


Ролг Хупин

Ролг Хупин,Вы выполняете sql запрос для каждого файла, это не рационально,сформируйте что-то *********** into ...values( ... ), ( ... ), ( ... )