Здравствуйте, <Аноним>, Вы писали:
А>Теперь ошибка такая "An unhandled exception of type 'System.Data.SqlClient.SqlException' occurred in system.data.dll Additional information: System error." в строке: А>видать Sql не подключен. Извеняюсь — не скажете как его подрубить?
Установить MSSQL Server, создать базу Test, в ней табличку files и две ХП, текст которых я приводил. Состав полей таблички можно увидеть по второй ХП.
Сделал без записи на сервер, чтоб отделить скорость собственно .NET и "скорость работы Алексея с ADO.NET". Код специально совершенно неоптимальный, в скриптовом стиле. Чтоб было видно, что дотнет и такое стерпит.
Даже свойства FileInfo лень было смотреть в документации, просто перебираю через Reflection. Остальное в том же духе.
Средняя скорость перебора даже со всеми этими тормозами — 490 файлов в секунду.
D:\Program Files
17:51:11
Total time: 139.0 sec, 68213 files, 490.6 by sec.
Присоединяюсь к мнению AVK. Дайте мне такой винчестер, чтоб там такой перебор работал пять часов. Я таких объёмов ещё в руках не держал.
using System;
using System.Collections;
using System.IO;
using System.Reflection;
using System.Threading;
class Run
{
static readonly string rootPath=
Path.GetPathRoot( System.Environment.SystemDirectory )+"Program Files";
static ArrayList files=new ArrayList();
static bool complete=false;
static void Main()
{
Console.WriteLine( rootPath );
DateTime start=DateTime.Now;
Console.WriteLine( start.ToLongTimeString() );
// Чтобы красиво отпечатывать прогресс, запустим-ка его в отдельном потоке...new ThreadStart( asyncMain ).BeginInvoke( null, null );
while( !complete )
{
// Собственно, прогресс
DateTime startSecond=DateTime.Now;
int startSecondCount=files.Count;
Thread.Sleep(1000);
if( files.Count>0 )
{
Console.Write(
"\r"+
(DateTime.Now-start).TotalSeconds.ToString("0.0")+" sec, "+
files.Count+" files, "+
( (files.Count-startSecondCount)/(DateTime.Now-startSecond).TotalSeconds ).ToString("0.0")+" by sec..." );
}
}
// Итоги
Console.WriteLine(
"\rTotal time: "+(DateTime.Now-start).TotalSeconds.ToString("0.0")+" sec, "+
files.Count+" files, "+
( files.Count/(DateTime.Now-start).TotalSeconds ).ToString("0.0")+" by sec." );
Console.Write( "show random..." ); Console.ReadLine();
// Чтоб никто не сомневался, выводим три случайных файла из набора
Console.WriteLine( "\nRandom files:\n" );
Random rnd=new Random();
for( int i=0; i<3; i++ )
{
Console.WriteLine( files[rnd.Next(files.Count)] );
}
Console.Write( "quit..." ); Console.ReadLine();
}
static void asyncMain()
{
try
{
addFiles(rootPath);
}
catch( Exception e )
{
Console.WriteLine( e );
}
finally
{
complete=true;
}
}
static void addFiles(string folder)
{
foreach( string dir in Directory.GetDirectories(folder) )
{
// Единственное аккуратное место во всей программе -
// объекты DirectoryInfo не уходят в "лавину рекурсии".
// В стеке только строки.
addFiles( Path.Combine(folder,dir) );
}
foreach( string file in Directory.GetFiles(folder) )
{
FileInfo fsi=new FileInfo(
Path.Combine(folder,file) );
// Нам StringBuilder ни к чему. Мы не торопимся.string fileStr=file+"\n";
// А фиг ли этот MSDN. Всё и так в метаданных прописано.
// И кешировать typeof(FileInfo), кстати, тоже не будем.foreach( PropertyInfo prop in fsi.GetType().GetProperties() )
{
fileStr+=
"\t"+prop.Name+": "+prop.GetValue(fsi,null)+"\n";
}
files.Add(fileStr);
}
}
}
Сделал без записи на сервер, чтоб отделить скорость собственно .NET и "скорость работы Алексея с ADO.NET". Код специально совершенно неоптимальный, в скриптовом стиле. Чтоб было видно, что дотнет и такое стерпит.
Даже свойства FileInfo лень было смотреть в документации, просто перебираю через Reflection. Остальное в том же духе.
Средняя скорость перебора даже со всеми этими тормозами — 490 файлов в секунду.
D:\Program Files
17:51:11
Total time: 139.0 sec, 68213 files, 490.6 by sec.
Присоединяюсь к мнению AVK. Дайте мне такой винчестер, чтоб там такой перебор работал пять часов. Я таких объёмов ещё в руках не держал.
using System;
using System.Collections;
using System.IO;
using System.Reflection;
using System.Threading;
class Run
{
static readonly string rootPath=
Path.GetPathRoot( System.Environment.SystemDirectory )+"Program Files";
static ArrayList files=new ArrayList();
static bool complete=false;
static void Main()
{
Console.WriteLine( rootPath );
DateTime start=DateTime.Now;
Console.WriteLine( start.ToLongTimeString() );
// Чтобы красиво отпечатывать прогресс, запустим-ка его в отдельном потоке...new ThreadStart( asyncMain ).BeginInvoke( null, null );
while( !complete )
{
// Собственно, прогресс
DateTime startSecond=DateTime.Now;
int startSecondCount=files.Count;
Thread.Sleep(1000);
if( files.Count>0 )
{
Console.Write(
"\r"+
(DateTime.Now-start).TotalSeconds.ToString("0.0")+" sec, "+
files.Count+" files, "+
( (files.Count-startSecondCount)/(DateTime.Now-startSecond).TotalSeconds ).ToString("0.0")+" by sec..." );
}
}
// Итоги
Console.WriteLine(
"\rTotal time: "+(DateTime.Now-start).TotalSeconds.ToString("0.0")+" sec, "+
files.Count+" files, "+
( files.Count/(DateTime.Now-start).TotalSeconds ).ToString("0.0")+" by sec." );
Console.Write( "show random..." ); Console.ReadLine();
// Чтоб никто не сомневался, выводим три случайных файла из набора
Console.WriteLine( "\nRandom files:\n" );
Random rnd=new Random();
for( int i=0; i<3; i++ )
{
Console.WriteLine( files[rnd.Next(files.Count)] );
}
Console.Write( "quit..." ); Console.ReadLine();
}
static void asyncMain()
{
try
{
addFiles(rootPath);
}
catch( Exception e )
{
Console.WriteLine( e );
}
finally
{
complete=true;
}
}
static void addFiles(string folder)
{
foreach( string dir in Directory.GetDirectories(folder) )
{
// Единственное аккуратное место во всей программе -
// объекты DirectoryInfo не уходят в "лавину рекурсии".
// В стеке только строки.
addFiles( Path.Combine(folder,dir) );
}
foreach( string file in Directory.GetFiles(folder) )
{
FileInfo fsi=new FileInfo(
Path.Combine(folder,file) );
// Нам StringBuilder ни к чему. Мы не торопимся.string fileStr=file+"\n";
// А фиг ли этот MSDN. Всё и так в метаданных прописано.
// И кешировать typeof(FileInfo), кстати, тоже не будем.foreach( PropertyInfo prop in fsi.GetType().GetProperties() )
{
fileStr+=
"\t"+prop.Name+": "+prop.GetValue(fsi,null)+"\n";
}
files.Add(fileStr);
}
}
}
Здравствуйте, VladD2, Вы писали:
VD>В Шарпе есть понятие массив массивов, а есть многомерный массив. Точ то ты спрашивал (про ассоциативные массивы) вообще к языку не оносится. А то, что тебе показывал АВК — это как раз массивы одномерные (временами вложенные).
Вложенные одномерные массивы и есть многомерный массив. В MSDN это зовут jagged arrays
Здравствуйте, VladD2, Вы писали:
VD>Ну, не знаю я с С++ и Дельфи за пять минут перелез. Конечно тонкости есть везде, но хэш-таблицы они и в африке хэш-таблицы (правда в Дельфи они появились только в шестерке).
Строковый хеш в пятерке был точно, а может и раньше.