Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Strangers
1 / 1 / 1
Регистрация: 08.02.2013
Сообщений: 47
#1

Уникальные элементы в большом списке - C#

10.12.2013, 23:52. Просмотров 2317. Ответов 33
Метки нет (Все метки)

Задача состоит в следующем: есть List<string> в котором 15 миллионов записей. Мне нужно подсчитать сколько раз встречается каждый уникальный элемент и вывести элементы в порядке наибольшего количество повторений до наименьшего.

Делал через LINQ, но с небольшими списками. После того как количество элементов перевалило за 2 миллиона LINQ не тянет. Перебирать циклами очень долго получается. Заранее спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2013, 23:52
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Уникальные элементы в большом списке (C#):

Найти в массиве повторяющиеся элементы и записать только уникальные элементы в новый массив из первого массива
Всем привет. Можете помочь написать такой алгоритм, нужно в одном массиве...

Уникальные элементы матрицы
Дана матрица найти уникальные элементы матрицы и их количество. Уникальным...

Уникальные элементы списка
Есть два List&lt;string&gt;. Каким образом найти все элементы первого списка, которых...

Поменять положительные элементы в списке
Здравствуйте, мне нужно поменять положительные элементы в списке на число &quot;R&quot;,...

Как найти одинаковые элементы в списке List
Нужно найти все не уникальные числа последовательности, метод Distinct не...

В списке все элементы, стоящие перед максимальным, заменить на 0
Помогите, пожалуйста, с этой прогой. (То, что должна выполнять прога: Ввод...

33
DataPlanner
153 / 183 / 49
Регистрация: 25.11.2013
Сообщений: 978
11.12.2013, 13:41 #21
Цитата Сообщение от агерон Посмотреть сообщение
загрузить текстовой файл даже в 2Гб как единый кусок в память
1. Не передергивай, твой код читает файл в 214Мб;
2. using (var bufferedStream = new BufferedStream(readFile, 1048576)) - Ты не умеешь пользоваться BufferedStream, его использование в твоем коде ничего не дает, можешь его выкинуть из кода, ничего не поменяется. На будущее, используй MemoryMappedFile, это тебе для расширения кругозора;
3. ...альтернатива.. конечно есть, вот она: альтернатива (byte) oktet >> 8;
4. ..а в том что я построчно читаю файл.. без разницы, файл читаешь не ты, а подсистема win, не путай, можешь читать все в одну строку, ничего не поменяется;
5. Словом, ну, ты понял...
0
агерон
313 / 279 / 57
Регистрация: 12.10.2009
Сообщений: 1,086
11.12.2013, 14:10 #22
Боже мой дай сил разума этому идиоту,
1) я знаю что текстовые файлы бывают большими, очень большими
2) MemoryMapedFile применяеться только для блочного (читай бинарного) чтения файла, а при бинарном чтении ты спокойно можешь разорвать ip адрес и фиг ты его разорваный потом выковыряешь из 2 кусков которые получишь при чтении через MemoryMappedViewStream
3) позвольте поинтересоваться а каким образом вы собираетесь получить 4 октета ip адреса? уж не через Regex? или будете писать свой велосипед разбора бинарного куска? Т. к. мы помним что MemoryMappedViewStream позволяет читать только бинарными блоками или ты думаешь что я про него не знаю?
4) файл конечно читает дисковая подсистема но! и using (var bufferedStream = new BufferedStream(readFile, 1048576)) это именно как раз буферизация чтения файла т. к. я таким формирую кеш в оперативной памяти а не читаю на прямую с диска
5) ну ты понял... иди учись студент, да MSDN с книгами нормально читай я про маппинг файлов знаю еще с WinAPI и WCF если тебе знакомы такие понятия

Добавлено через 6 минут
P. S. могу сказать лишь одно в конец нашей дискусии,
1) от тебя я так и не увидил не единой строчки кода, либо ссылки на авторитетные источники
2) ты разводишь флейм, а флейм это зло
3) задача TC успешно решена и решина мной а не тобой
4) Вывод ты школьник либо студент + в добавок троль а я тролей кормить считаю ниже своего достоинства за сим откланиваюсь и заношу тебя в бан
0
DataPlanner
153 / 183 / 49
Регистрация: 25.11.2013
Сообщений: 978
11.12.2013, 14:16 #23
Удачи, удачи, иди, переваривай инфу, сегодня много узнал, отдохни.
0
агерон
313 / 279 / 57
Регистрация: 12.10.2009
Сообщений: 1,086
11.12.2013, 14:20 #24
тебе хочется свое слово последним оставить да ради бога, свое мнение к тебе я уже показал, думаю минус к репутации тебя также заставит задуматься
1
Hsert
10 / 25 / 9
Регистрация: 08.12.2013
Сообщений: 115
11.12.2013, 16:29 #25
не нашел проблемы с Linq, автор темы даже не знает , в чем у него проблема.

Regex, работает очень медленно, именно потому рекомендуют не создавать объект Regex, а пользоваться его статическими членами.
Если у тебя проблема с параллельным доступом многих потоков к файлу, то воспользуйся
C#
1
System.Threading.ReaderWriterLockSlim
0
Strangers
1 / 1 / 1
Регистрация: 08.02.2013
Сообщений: 47
11.12.2013, 18:11  [ТС] #26
Цитата Сообщение от Hsert Посмотреть сообщение
не нашел проблемы с Linq, автор темы даже не знает , в чем у него проблема.

Regex, работает очень медленно, именно потому рекомендуют не создавать объект Regex, а пользоваться его статическими членами.
Если у тебя проблема с параллельным доступом многих потоков к файлу, то воспользуйся
C#
1
System.Threading.ReaderWriterLockSlim
Проблема решена. Автор темы прекрасно знает в чем у него проблема.
0
DataPlanner
153 / 183 / 49
Регистрация: 25.11.2013
Сообщений: 978
12.12.2013, 06:43 #27
Цитата Сообщение от агерон Посмотреть сообщение
тебе хочется свое слово последним оставить да ради бога, свое мнение к тебе я уже показал, думаю минус к репутации тебя также заставит задуматься
Главное, чтобы тебя заставило задуматься это:
C#
1
2
3
4
5
6
7
8
9
public static IEnumerable<uint> GetIPAddress(StreamReader reader)
        {
            while (!reader.EndOfStream)
            {
                var data = reader.ReadLine();
                byte[] bt = data.Split('.').Select(s => Convert.ToByte(s)).ToArray();
                yield return (uint)(bt[0] | bt[1] << 8 | bt[2] << 16 | bt[3] << 24);
            }
        }
Добавлено через 9 минут
Буффер тоже можешь выбросить, равно как и File.OpenRead, достаточно using (var reader = new StreamReader("ip.txt")) (еще и быстрее будет!Ж)))

Добавлено через 1 минуту
Потом расскажешь, во сколько раз быстрее чтение пошло, полагаю раза в 3...
0
агерон
313 / 279 / 57
Регистрация: 12.10.2009
Сообщений: 1,086
12.12.2013, 09:22 #28
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
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
 
namespace _1036672
{
    class Program
    {
        static void Main(string[] args)
        {
            string testData1 = "ip address attack: 74.125.143.94";
            string testData2 = "ip address attack: 10.1.2.15952";
            Test1(testData1);
            Test2(testData1);
            Test1(testData2);
            Test2(testData2);
            Test3(testData2);
        }
 
        public static void Test1(string data)
        {
            Console.WriteLine("Тест #1 начат.");
            uint result = 0;
            try
            {
                byte[] bt = data.Split('.').Select(s => Convert.ToByte(s)).ToArray();
                result = (uint)(bt[0] | bt[1] << 8 | bt[2] << 16 | bt[3] << 24);
            }
            catch (Exception e)
            {
                Console.WriteLine(string.Format("Ошибка: {0}", e.Message));
            }
            finally
            {
                Console.Write("Тест#1 закончен. Данные: \"{0}\", результат: {1}", data, result);
                Console.ReadLine();
            }
        }
 
        public static void Test2(string data)
        {
            Console.WriteLine("Тест #2 начат.");
            uint result = 0;
            try
            {
                const string pattern = "(?<address>(\\d{1,3}\\.{0,1}){4})";
                const string address = "address";
                var ipString =
                    Regex.Match(data, pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline)
                         .Groups[address].Value;
                var ipBytes = IPAddress.Parse(ipString).GetAddressBytes();
                result = BitConverter.ToUInt32(ipBytes,0);
            }
            catch (Exception e)
            {
                Console.WriteLine(string.Format("Ошибка: {0}", e.Message));
            }
            finally
            {
                Console.Write("Тест#2 закончен. Данные: \"{0}\", результат: {1}", data, result);
                Console.ReadLine();
            }
        }
 
        public static void Test3(string data)
        {
            Console.WriteLine("Тест #3 начат.");
            uint result = 0;
            try
            {
                var ipBytes = IPAddress.Parse(data).GetAddressBytes();
                result = BitConverter.ToUInt32(ipBytes, 0);
            }
            catch (Exception e)
            {
                Console.WriteLine(string.Format("Ошибка: {0}", e.Message));
            }
            finally
            {
                Console.Write("Тест#3 закончен. Данные: \"{0}\", результат: {1}", data, result);
                Console.ReadLine();
            }
        }
 
    }
}
Понимаешь DataPlanner у TC на входе лог DDos атаки, а не автосгенерированный список ip, вот тебе тесты на счет твоего и моего метода разбора ip. да мое regex выражение позволяет ложно положительное срабатывание, что указывает тест под №3, но в конце концов кто мешает подогнать TC мое выражение под свой лог?, а твой подход работает только при условии того что тебе дают заведомо коректные данные, а такого к сожалению в настоящем мире мало где случается. Да твой подход работает быстрее, примерно в 2 раза но кто тебе сказал что TC нужно быстрота?? ему нужно на вход получить корректные данные для анализа а не просто обработать и подсчитать сгенерированные ip адреса, а вот именно с проверкой корректности входных данных у твоего подхода и наблюдаются проблемы. Пойми в данном случае TC не важно что его лог будет обрабатываться пусть даже 5-8 часов ему важно коректно получить список ip которые он потом скормит циске и после этого циска на уровне TCP протокола будет заворачивать пакеты с данными ip адресами в dev/null что позволит снять эффект DDos атаки и восстановить нормальную работу сервера, вот что главное, а не то на сколько миллисекунд быстрее определяется ip адрес в идеальных условиях.

Добавлено через 2 минуты
по этому не обижайся но иди учись писать прикладные программы которые будут адекватно работать в реальных условиях а не только в песочнице в которой их обычно разрабатывают
0
агерон
313 / 279 / 57
Регистрация: 12.10.2009
Сообщений: 1,086
12.12.2013, 09:24 #29
вот забыл прикрутить результаты тестов
0
Миниатюры
Уникальные элементы в большом списке  
DataPlanner
153 / 183 / 49
Регистрация: 25.11.2013
Сообщений: 978
12.12.2013, 10:14 #30
Цитата Сообщение от агерон Посмотреть сообщение
C#
1
2
3
using (var readFile = File.OpenRead("ip.txt"))
 using (var bufferedStream = new BufferedStream(readFile, 1048576))
 using (var reader = new StreamReader(bufferedStream))
С этим разобрался? Понял, что этот бред не работает? Кстати буфер на таких операциях ставь 64 Кб, больше-меньше overhead
0
агерон
313 / 279 / 57
Регистрация: 12.10.2009
Сообщений: 1,086
12.12.2013, 11:06 #31
что твой подход к чтению файла что мой, не показали разницы, время обработки снижалось только при смене функции парсинга ip, а на счет этого читай пост выше, по этому я считаю что наши подходы к чтению файла как минимум равнозначны и твой подход не дает преимуществ, а на счет моего... не знаю может на больших файлах, порядка нескольких десятков ГБ, и будет видна разница в подходах но поверь на тестовом файле я разницы не увидел

Добавлено через 5 минут
Как минимум все что ты тут сказал это пустая трата времени, ты дергаешься из-за миллисекунд доступа к файлу и быстроты парсинга ip но о корректности что входных что выходных данных ты не заботишься, и играешься с идеально правильными автосгенерированными данными а главное упускашь из виду, ведь главное решить задачу разбора лога и отсечения дубликатов ip, а вот адекватного ответа по этому вопросу я так и не увидел
0
DataPlanner
153 / 183 / 49
Регистрация: 25.11.2013
Сообщений: 978
12.12.2013, 12:20 #32
Разница в том, что ты копируешь массив (за кулисами) дважды, причем совершенно бессмыссленно. BufferedStream хороший инструмент, но с ним надо работать, а так втыкать бесполезно, никаких бенефитов не получишь. Более того StreamReader изначально заточен под работу с большими файлами, очень большими, для этого у него есть метод ReadBlock. В данном случае файл небольшой (до 2 Гб), соответственно можно исползовать StreamReader в голом виде, там за кулисами он все делает сам.
PS. Не думай, что мне больше делать нечего, как решать кому-то задачки, у меня и своего кода пруд пруди. Задачки мне некогда решать, а вот подсказать я могу, рекомендую здравую критику воспринимать адекватно.
0
Hsert
10 / 25 / 9
Регистрация: 08.12.2013
Сообщений: 115
12.12.2013, 13:19 #33
Цитата Сообщение от Strangers Посмотреть сообщение
Проблема решена. Автор темы прекрасно знает в чем у него проблема.
хорошо
0
агерон
313 / 279 / 57
Регистрация: 12.10.2009
Сообщений: 1,086
12.12.2013, 16:32 #34
В том то и дело что здравой критики у тебя не наблюдается, есть только жалкие потуги на академичность, и упорное долбление своей точки зрения, я же со своей стороны привожу адекватные аргументы которые ты в упор не видишь, и только когда тебя носом тычешь в тесты которые показывают мою правильность решения ты уходишь на попятую, а на счет "мне некогда решать задачки", ведь время переписываться со мной ты нашел
0
12.12.2013, 16:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2013, 16:32
Привет! Вот еще темы с решениями:

Новый список, содержащий элементы списка A, отсутствующие в списке B
Даны два объекта A, B типа List&lt;int&gt; Нужно создать новый список, который...

Массив целых чисел «свернуть в кольцо» и упорядочить элементы в списке по возрастанию
Помогите, дали задание написать программу в виндовс форм, ни разу не работал в...

В списке все элементы различны. Поменяйте местами минимальный и максимальный элемент этого списка
В списке все элементы различны. Поменяйте местами минимальный и максимальный...

Подсчет строк в большом файле
Здравствуйте, каким образом можно подсчитать количество строк в файлах допустим...


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru