Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
 Аватар для Монфрид
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,246

Какой массив использовать для хранения больших объёмов информации?

03.06.2012, 18:50. Показов 1733. Ответов 4

Студворк — интернет-сервис помощи студентам
В целях саморазвития пишу программу для поиска дубликатов файлов по названию. Алгоритм типа такого:
в отдельном потоке происходит запись информации о файле в HashSet (почему hashset? хз..).
Потом из этого массива при помощи linq находятся дубликаты файлов. И всё это выводится в LV.
При небольших входных данных, программа работает относительно быстро. Но сейчас указал ей для примера строку поиска в C:\\Users\\. Ну и видно что конкретно это подгрузило её. В диспетчере задач сейчас она жрёт порядка 390Мб, при этом прогресс бар только на ~35%.

Хочу у вас спросить, каким образом оптимизировать работу? может использовать какие то специальные массивы/коллекции (не HashSet, как у меня, а что то другое). Либо всякие новомодные примочки добавить, типа Paralell? Буду благодарен любой помощи
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.06.2012, 18:50
Ответы с готовыми решениями:

Какой массив использовать для хранения множества точек
В общем задача у меня такая: надо нарисовать персонажа из точек и прямых (скелет типа), с последующим его редактированием (выбираем точку и...

Какой алгоритм getHashCode использовать как для больших значений, так и для маленьких
Есть некий класс с какими-то числовыми полями. Причем значения полей могут варьироваться во всей области значений инта. Какой алгоритм...

Какой вид хранения данных лучше использовать?
День добрый. Мне нужно определиться в чём лучше хранить данные, сохраняемые и обрабатываемые программой. По хорошему конечно бы работать с...

4
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
03.06.2012, 18:52
Чтобы давать советы по оптимизации, нужно видеть оригинальный код.
А то мы сейчас вам насоветуем всяких умностей, а потом окажется что вашу программу тормозит какое-нибудь построение строки в цикле.
0
 Аватар для Монфрид
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,246
03.06.2012, 19:19  [ТС]
спасибо за внимание, вот такой код, если много глупостей, буду рад, если направите на путь истинный
Главная форма:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
public partial class Form1 : Form
    {
        delegate void PositionDelegate(int pos);
        HashSet<FileClass>  files = new HashSet<FileClass>();
        event PositionDelegate ChangePosition;
        int current;
 
        /// <summary>
        /// текущий прогресс работы
        /// </summary>
        int CurrentPosition
        {
            get
            { return current; }
            set
            {
                if (ChangePosition != null)
                    ChangePosition(current);
                current = value;
            }
        }
 
        public Form1()
        {
            InitializeComponent();
            ChangePosition += delegate(int pos)
            {
                if (progressBar1.InvokeRequired)
                    progressBar1.Invoke(new MethodInvoker(delegate
                    {
                        progressBar1.Value = pos;
                    }));
                else
                    progressBar1.Value = pos;
            };
        }
 
        /// <summary>
        /// Отображение в label текущей папки
        /// </summary>
        /// <param name="currentDir"></param>
        void controlCallBack(string currentDir)
        {
            label1.Invoke(new MethodInvoker(delegate
            {
                label1.Text = currentDir;
            }));
        }
 
        /// <summary>
        /// Поиск файлов в папках(включая подпапки)
        /// </summary>
        /// <param name="dr"></param>
        /// <param name="pattern"></param>
        void getallfiles(DirectoryInfo dr, string pattern)
        {
            try
            {
                dr.GetFiles(pattern).ToList().ForEach(s =>
                {                    
                    files.Add(new FileClass() { Name = s.Name, FullPath = s.FullName, Size = s.Length });
                    controlCallBack(s.FullName);
                });
 
            }
            catch (UnauthorizedAccessException)
            {                
            }
 
            try
            {
                foreach (DirectoryInfo d in dr.GetDirectories())
                    getallfiles(d, pattern);
            }
            catch (UnauthorizedAccessException)
            { }
        }
 
 
        /// <summary>
        /// создание потока для поиска дубликатов
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            new Thread(new ThreadStart(delegate
            {
                getallfiles(new DirectoryInfo(@"C:\Users\lionell"), "*.*");
 
                var dublicates = from rep in files group rep by rep.Name into g where g.Skip(1).Any() from rep in g select rep;
                
                double curr=0;
                listView1.Invoke(new MethodInvoker(delegate
                {
                    listView1.BeginUpdate();
                }));
                foreach (var f in dublicates)
                {
                    listView1.Invoke(new MethodInvoker(delegate
                    {                        
                        ListViewItem it = new ListViewItem(f.Name);
                        it.SubItems.Add(f.FullPath);
                        listView1.Items.Add(it);
                    }));
                    curr += 1;
                    CurrentPosition = int.Parse(Math.Round((curr / dublicates.Count()) * 100, 0).ToString());                    
                }
                listView1.Invoke(new MethodInvoker(delegate
                {
                    listView1.EndUpdate();
                }));
            })) { IsBackground = true }.Start();
                       
        }
Вспомогательный класс:
C#
1
2
3
4
5
6
    class FileClass
    {
       public string Name { get; set; }
       public double Size { get; set; }
       public string FullPath { get; set; }
    }
0
 Аватар для Монфрид
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,246
03.06.2012, 19:33  [ТС]
проект вот тутFreeSpace.rar
0
 Аватар для Монфрид
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,246
03.06.2012, 19:52  [ТС]
методом научного тыка нашлись слабые места в программе. При помощи stopWatch замерил, сколько программа работает с обращением к компонентам: вывод в лейбл текущей папки и вывод прогресса, получилось порядка 1минуты 5 сек.
Сначала убрал из потока метод обновления label'a (ф-я controlCallback) - вышло уже 46секунд. Потом убрал и работу с прогресс-баром - вышло 4 секунды. Получается, что вся тягомотина от этого?
Может есть другой путь вывода инф-ии в контролы, чтобы не так это влияло на быстродействие программы?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.06.2012, 19:52
Помогаю со студенческими работами здесь

Алгоритмы сортировки больших объёмов данных
Здравствуйте, столкнулся со следующей проблемой: Имею бинарный файл, в котором хранится матрица из чисел размером примерно 10000 на 40....

Структура для хранения больших целочисленных значений
Всем доброго времени суток! Столкнулся я с такой задачей: Invent the format of the data structure to store large integers. Usage of...

Какой тип поля использовать для хранения больших файлов
Здравствуйте. Необходимо вставить большой файл в базу. Какой тип поля сделать? Blob, LBlob, Binary? Пробовал LONGBLOB, файл...

Свой сервер для хранения больших объемов информации
Подскажите пожалуйста. Сайт находится на платном хостинге, необходимо демонстрировать пользователям картинки и документы, которых свыше...

Записи в 2 поля: стоит ли использовать БД для хранения подобной информации
Здравствуйте..Подскажите пожалуйста...Как организовать создание новой записи? То есть когда нажимаешь на кнопку, то в два поля надо ввести...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru