Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658

Скорость обработки данных

22.08.2015, 16:24. Показов 2868. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста что можно использовать для высокой скорости обработки данных, акцесс меня честно говоря не очень устроил, он начал серьезно залипать на 10тыс записях в таблице, а мне нужно практически мгновенно получать ответ на запрос...

Необходимые мне действия которые должны выполняться максимально быстро
1) проверка наличия записи в таблице
2) извлечение конкретных ячеек
3) ну и наконец добавление новых записей(хоть и не критично).
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.08.2015, 16:24
Ответы с готовыми решениями:

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

Скорость обработки строк
Дано: .Net Framework a, b - переменные типа String a.Length=50 b = большой лог-файл Вопросы: 1. Какая функция выполнится...

Скорость обработки данных
Привет всем у меня вопрос по скорости загрузки из бд. Я заношу данные о адресе из yandex карт. В любом случае есть область, но я ее заменил...

23
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
22.08.2015, 16:51
Используйте MSSQL СУБД.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
22.08.2015, 17:22
Цитата Сообщение от koc94ok Посмотреть сообщение
10тыс записях в таблице, а мне нужно практически мгновенно получать ответ на запрос
List<T> или Dictionary<T,U> в памяти вас спасет. Быстрее ничего не будет.
0
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
22.08.2015, 17:30
Storm23, А когда произойдет выход из программы?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
22.08.2015, 17:32
Цитата Сообщение от pro_100_gram Посмотреть сообщение
А когда произойдет выход из программы?
Serialization/Deserialization, можно еще ленивую/прозрачную подгрузку/выгрузку прикрутить.
PS Кстати можно сериализацию и в БД делать.
0
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
22.08.2015, 17:34
Storm23, т.е. хранить в БД это нет и это принципиально?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
22.08.2015, 17:40
Цитата Сообщение от pro_100_gram Посмотреть сообщение
т.е. хранить в БД это нет и это принципиально?
Ну блин:
1) MS SQL по вашему какой-то волшебный и не хранит таблицы в памяти? В нем нет что то типа List<T>? Он не делает загрузку/выгрузку в файлы? Конечно все это есть. По-любому он это делает, просто это от вас скрыто.
2) Если требуется максимальное быстродействие - гораздо быстрее загрузить все в память и обращаться к RAM (тем более что объем невелик - 10 тыс записей это копейки), чем гонять текстовые запросы по TCP к серверу SQL, который все равно будет делать все то же самое - загружать из файла в память, сериализовать/десериализовать и т.д.
0
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
22.08.2015, 17:56
Storm23, В БД можно хранить записи и индексировать по составным ключам, что увеличит производительность. К тому же Не обязательно MSSQL можно SQLite.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
22.08.2015, 18:16
Цитата Сообщение от pro_100_gram Посмотреть сообщение
В БД можно хранить записи и индексировать по составным ключам, что увеличит производительность.
Что вам мешает сделать индексирование в List<T> ? А Dictionary это уже и есть индекс, быстрее не придумаешь.
А вот для "1) проверка наличия записи в таблице" например идеален Hashset<T>.
В общем, меньше думайте штампами, не в обиду.
0
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
22.08.2015, 18:23
Storm23, Я о составных ключах писал, по ним строится дерево, и по дереву уже производится поиск, а в List<T> программе придется пройтись последовательно по каждому элементу, что гораздо снизит производительность.
Цитата Сообщение от Storm23 Посмотреть сообщение
В общем, меньше думайте штампами, не в обиду.
Где штамп? Человеку нужно ускорить производительность и для этого были созданы базы данных, если язык предоставляет возможность создавать хеш таблицы и словари это не означает, что для всего на свете нужно пользоваться этими структурами данных. К тому же 10 000 записей, не приходило в голову что они могут весить порядка 20гб?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
22.08.2015, 20:26
Цитата Сообщение от pro_100_gram Посмотреть сообщение
Я о составных ключах писал, по ним строится дерево, и по дереву уже производится поиск, а в List<T> программе придется пройтись последовательно по каждому элементу, что гораздо снизит производительность.
Нужно дерево? Ну сделайте дерево. Что вам мешает сделать дерево в программе?
Цитата Сообщение от pro_100_gram Посмотреть сообщение
нужно ускорить производительность и для этого были созданы базы данных
БД это унифицированное хранилище данных. К быстродействию не имеют никакого отношения.
Цитата Сообщение от pro_100_gram Посмотреть сообщение
если язык предоставляет возможность создавать хеш таблицы и словари
Язык тут вообще не при чем.
Цитата Сообщение от pro_100_gram Посмотреть сообщение
это не означает, что для всего на свете нужно пользоваться этими структурами данных
А кто говорит "для всего на свете"? Хештаблица нужна для решения конкретных задач. И она как раз подходит для "поиска существования записи" с максимальной скоростью.
Цитата Сообщение от pro_100_gram Посмотреть сообщение
К тому же 10 000 записей, не приходило в голову что они могут весить порядка 20гб?
Я разрабатываю высокропроизводительные системы с 1998 года. За это время мне очень много чего приходило в голову. Например: если на 10тыс записей у вас 20ГБ памяти, значит нужна денормализация таблицы. Тяжелые поля нужно вынести в отдельную таблицу, поскольку наврядли по ним будет идти поиск, и наврядли по ним будет индекс. Т.о. в память нужно загружать легкие поля, по которым идет поиск, а тяжелые - подгружать динамически.

Добавлено через 6 минут
pro_100_gram, Еще раз объясню свою точку зрения:
ТС спрашивает про "что можно использовать для высокой скорости обработки данных". Ответ очевиден - максимальную скорость обработки данных даст обработка данных непосредственно в памяти, без посредников типа БД. Тут не с чем спорить. И не нужно говорить про какие-то волшебные индексы СУБД. Все эти индексы вы можете реализовать и без БД.
Если бы ТС формулировал вопрос типа "как увеличить быстродействие без особого гемора/без потерь памяти/быстро/с минимальным изменением кода/с сохранением текущей струкутры данных и т.д.", то можно было бы говорить о СУБД. Но я лишь отвечаю на четкий вопрос "как сделать высокую скоорсть обработки". И я вовсе не призываю всегда и везде использовать хештаблицы вместо СУБД.
1
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
22.08.2015, 20:40
Цитата Сообщение от Storm23 Посмотреть сообщение
Нужно дерево? Ну сделайте дерево. Что вам мешает сделать дерево в программе?
Зачем? В БД уже реализовано.
Цитата Сообщение от Storm23 Посмотреть сообщение
БД это унифицированное хранилище данных. К быстродействию не имеют никакого отношения.
Запросы к БД имеют прямое отношение к производительности.

Я никогда не стану даже для 1000 записей юзать что-то кроме БД, чтобы хранить данные. Просто потому что есть такое как БД, оно именно для этого создано.

Добавлено через 4 минуты
Цитата Сообщение от Storm23 Посмотреть сообщение
Ответ очевиден - максимальную скорость обработки данных даст обработка данных непосредственно в памяти, без посредников типа БД. Тут не с чем спорить. И не нужно говорить про какие-то волшебные индексы СУБД. Все эти индексы вы можете реализовать и без БД.
Вообще-то любые данные при поиске заносятся в оперативную память для обработки. Доставать данные из бинарника или XML для избежания подключения БД не лучшее решение, хотя кому как. Я свое мнение высказал.
0
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658
22.08.2015, 21:05  [ТС]
Цитата Сообщение от pro_100_gram Посмотреть сообщение
Storm23, т.е. хранить в БД это нет и это принципиально?
В принципе без разницы где хранить данные, главное чтобы они оставались после завершения приложения(успешного или нет).
Цитата Сообщение от pro_100_gram Посмотреть сообщение
Используйте MSSQL СУБД.
Я использую сервер с самым дешевым тарифом, не знаю стоит ли загружать подобными вещами.
Цитата Сообщение от Storm23 Посмотреть сообщение
List<T> или Dictionary<T,U> в памяти вас спасет. Быстрее ничего не будет.
Сколько времени займет выбор из списка 1 элемента из 15000?

В общем из вышенаписанного я так понял лучше держать данные в каком-то списке, но только чтобы после завершения приложения данные не терялись(опять же успешного или нет)

Может поможете с примером подобного?
В моем конкретном случае данные имеют следующий формат:
C#
1
int id1,int id2, string name;
Для каждого id1&&id2 есть определенное имя.

Пример данных

11 22 Igor
22 33 Sveta

При вводе данных разумеется не стоит создавать в списке место для одних и тех же значений.

К примеру при добавлять 11 22 Igor второй раз нет смысла.

Сколько примерно памяти съест прога в памяти которой будет 10-15 тыс записей?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
22.08.2015, 22:07
Лучший ответ Сообщение было отмечено koc94ok как решение

Решение

koc94ok,
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
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
 
namespace ConsoleApplication198
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //проверяем наличие файла
            var file = "c:\\DataItems.bin";
            if (File.Exists(file))
                DB.Instance.Load(file);//загружаем данные
            else
            {
                //заполняем таблицу случайными данными
                var rnd = new Random(1);
                for(int i=0;i<10000;i++)
                    DB.Instance.DataItems.Add(new DataItem(){Id1 = rnd.Next(400), Id2 = rnd.Next(400), Name = "Name" + i});
            }
            //проверяем наличие записи (99, 44), засекаем время доступа
            var sw = Stopwatch.StartNew();
            var exists = DB.Instance.DataItems.Contains(new DataItem() {Id1 = 99, Id2 = 44});
            sw.Stop();
            Console.WriteLine("Result: {0},  Search Time: {1}", exists, sw.Elapsed);
            //сохраняем БД
            DB.Instance.Save(file);
            //
            Console.ReadLine();
        }
    }
 
    [Serializable]
    class DataItem
    {
        public int Id1 { get; set; }
        public int Id2 { get; set; }
        public string Name { get; set; }
 
        public override int GetHashCode()
        {
            return Id1 ^ Id2;
        }
 
        public override bool Equals(object obj)
        {
            if(obj is DataItem)
            {
                var item = obj as DataItem;
                return item.Id1 == Id1 && item.Id2 == Id2;
            }
 
            return false;
        }
    }
 
    [Serializable]
    class DataItems: HashSet<DataItem>
    {
        public DataItems()
        {
        }
 
        public DataItems(SerializationInfo info, StreamingContext context) : base(info, context)
        {
        }
    }
 
    class DB
    {
        public readonly static DB Instance = new DB();
        public DataItems DataItems { get; private set; }
 
        public DB()
        {
            DataItems = new DataItems();
        }
 
        public void Load(string fileName)
        {
            using(var stream = File.OpenRead(fileName))
            using(var zip = new GZipStream(stream, CompressionMode.Decompress))
                DataItems = (DataItems)new BinaryFormatter().Deserialize(zip);
        }
 
        public void Save(string fileName)
        {
            using (var stream = File.OpenWrite(fileName))
            using (var zip = new GZipStream(stream, CompressionMode.Compress))
                new BinaryFormatter().Serialize(zip, DataItems);
        }
    }
}
Время поиска одной записи (в Release, CTRL-F5) - 0.0000029 сек (хотя это все равно меньше разрешающей способности таймера, так что это очень приблизительные цифры).
Размер файла - ок 113кб (сжатие gzip).
Занимаемая память - ок 8мб.
2
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
23.08.2015, 11:08
а SQLite не подойдет?

Добавлено через 2 минуты
или firebird

короче то, что не будет требовать рабочего сервера
1
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658
24.08.2015, 17:57  [ТС]
VLK, я пока остановился на варианте Storm23, работает в 2-3 раза быстрее
Возможно переберусь на БД в перспективе, пока такая необходимость отпала.
0
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658
13.09.2015, 17:19  [ТС]
Storm23,
у меня при добавлении данных помимо тех что в примере как-то некорректно сохраняется файл и при новом открытии его не видит старых данных...

Добавляю сюда
C#
1
2
3
4
5
6
7
        public int Id1 { get; set; }
        public int Id2 { get; set; }
        public string Name { get; set; }
//добавляю
        public float Percent { get; set; }
        public int Count { get; set; }
        public DateTime Date{ get; set; }
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
13.09.2015, 17:25
Вы файл DataItems.bin новый создаете после того как добавляете новые поля в класс?
0
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658
13.09.2015, 19:08  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
Вы файл DataItems.bin новый создаете после того как добавляете новые поля в класс?
Да.

Спустя первых элементов 500 сохраняю-загружаю все хорошо, но чуть дальше и перестает грузить. Причем ошибок никаких нет, просто 0 элементов.

И дело скорее всего не в количестве, со старыми полями закачивал и 100 тыс элементов, все работало идеально.
0
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658
13.09.2015, 19:26  [ТС]
Сейчас попытаюсь загрузить картинки...
Миниатюры
Скорость обработки данных   Скорость обработки данных  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.09.2015, 19:26
Помогаю со студенческими работами здесь

Необходимо увеличить скорость обработки данных в Visual Studio 2010
Я работаю с большими массивами и хочу (если возможно) увеличить скорость обработки выполняемых операций. Не знаю как это сделать, видимо,...

Скорость обработки
Добрый вечер. Столкнулся с такой проблемой, работаю с большим двумерным массивом байтового типа, то есть загружаю его в программу и...

скорость обработки
Господа програмисты делаю программу и встал такой вопрос-допустим у нас есть такой код int a; a=0; for ( ; ; ) { a++ ; } ...

Скорость обработки циклов
Подскажите пожалуйста какой способ организации проверки работает быстрее if ((x&gt;0) and (y&gt;0) and ....) then .... или if ...

QCamera скорость обработки
Добрый день! Как можно уменьшить время затрачиваемое на обработку фото используя QCamera?


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru