Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 11.09.2015
Сообщений: 25

Как использовать оперативную память рационально?

06.12.2015, 18:20. Показов 3380. Ответов 55
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Есть код программы, где я сравниваю 2 текстовых файла, и если n-строка в первом не находит идентичную во втором, то она записывается в новый файл. Файлы большие и при j=167772 вылазит ошибка - Необработанное исключение типа "System.OutOfMemoryException" в mscorlib.dll.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
List<string> iskl1 = new List<string>();
            List<string> isklob = new List<string>();
            StreamReader sr1iskl = new StreamReader("D:\\Program\\farVariant.txt");
            string stroka1;
            while ((stroka1 = sr1iskl.ReadLine()) != null)
            { iskl1.Add(stroka1); }
            List<string> iskl2 = new List<string>();
            StreamReader sr2iskl = new StreamReader("D:\\Program\\IskVariantOB.txt");
            string stroka2;
            while ((stroka2 = sr2iskl.ReadLine()) != null)
            { iskl2.Add(stroka2); }
            for (int j = 0; j < iskl1.Count; j++)
            {
                for (int i = 0; i < iskl2.Count; i++)
                {
                    if (iskl1[j] != iskl2[i])
                    {
                        isklob.Add(iskl1[j]);
                    }
                }
 
            } File.WriteAllLines("D:\\Program\\variantfinal.txt", isklob);
Пытаясь найти решение, я полез в интернет и наткнулся на тему "LINQ и итераторы" где возможен вариант, когда мы не держим полный объем данных в памяти, а обрабатываем от начала до конца все данные поэлементно. Мы всего раз проходим по всему объему данных и держим в памяти всего один элемент данных, то есть одну строку.

Там прилагается код подобный моему
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
using System;
using System;
using System.Collections.Generic;
using System.Text;
 
namespace EnumerableDemo.Bad
{
 public class StringTransformer
 {
  IDictionary<string, string> _catalog = new Dictionary<string, string>
  {
   {"012345", "Car"},
   {"012346", "Bus"},
   {"012347", "Train"}
  };
 
  public StringTransformer()
  {
   _catalog.Add("%Date%", DateTime.Now.ToString("d"));
  }
 
  public IList<string> Transform(IList<string> strs)
  {
   var list = new List<string>();
 
   foreach (var item in strs)
   {
    var builder = new StringBuilder(item);
    foreach (var key in _catalog.Keys)
    {
     builder.Replace(key, _catalog[key]);
    }
    list.Add(builder.ToString());
   }
 
   return list;
  }
 }
}
И предлагается решение в виде
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
using System;
using System.Collections.Generic;
using System.IO;
 
namespace EnumerableDemo.Good
{
 class MainClass
 {
  public static IEnumerable<string> ReadInput()
  {
   using (var file = File.OpenText("input.txt"))
   {
    while (!file.EndOfStream)
    {
     yield return file.ReadLine();
    }
   }
  }
 
  public static void WriteOutput(IEnumerable<string> strs)
  {
   using (var file = File.CreateText("output.txt"))
   {
    foreach (var str in strs)
    {
     file.WriteLine(str);
    }
   }
  }
 
  public static void Main(string[] args)
  {
   var stringTransformer = new StringTransformer();
   var input = ReadInput().Where(str=>str.Length > 5);
   var transformed = stringTransformer.Transform(input);
   WriteOutput(transformed);
  }
 }
}
Можно ли как-нибудь мне сделать аналогично? Чтоб не насиловать память и уменьшить время обработки?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.12.2015, 18:20
Ответы с готовыми решениями:

Можно-ли использовать флэшку как оперативную память?
Действительно-ли можно увеличить оперативную память при помощи флэшки? Что скажите о программе &quot;eBoostr&quot;?

Можно ли использовать оперативную память от ноутбука на компьютере?
Может конечно странный вопрос, но тем не менее... Есть убитый ноут, экран треснул, можно ли каким либо чудом использовать возможности...

Windows позволяет использовать не всю оперативную память
Всем привет Такая проблема. Windows позволяет использовать не всю оперативную память. Во вкладке ОЗУ : Общий объём - 12 гб (доступно...

55
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
11.12.2015, 00:08
Студворк — интернет-сервис помощи студентам
попробуй так

Logic.cs
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
using System.Collections.Generic;
using System.IO;
using System.Linq;
 
namespace ConsoleApplication7
{
    public class Logic
    {
        private IEnumerable<string> GetLines(StreamReader reader)
        {
            while (!reader.EndOfStream)
                yield return reader.ReadLine();
        }
 
        public IEnumerable<string> GetHashLines(StreamReader reader)
        {
            while (!reader.EndOfStream)
            {
                var str = reader.ReadLine();
                yield return str.Substring(0, 10);
            }
        }
 
        public Dictionary<string, List<uint>> GetFirstData(string filename)
        {
            uint index = 0;
            var result = new Dictionary<string, List<uint>>();
            using (var reader = File.OpenText(filename))
            foreach (var key in GetHashLines(reader))
            {
                if (!result.ContainsKey(key))
                    result[key] = new List<uint>();
                result[key].Add(index++);
            }
            return result;
        }
        public HashSet<string> GetSecondData(string filename)
        {
            HashSet<string> result;
            using (var reader = File.OpenText(filename))
            {
                result = new HashSet<string>(GetHashLines(reader));
            }
            return result;
        }
 
        public void ProcessingFiles(string firstFile, string secondFile, string resultFile, int minCountLine, int maxCountLine)
        {
            var firstData = GetFirstData(firstFile);
            var secondData = GetSecondData(secondFile);
            secondData.IntersectWith(firstData.Keys);
            var thirdData =
                secondData.Select(x => firstData[x])
                    .Where(y => y.Count >= minCountLine && y.Count <= maxCountLine).Select(z => z[0])
                    .ToList();
            int index = 0;
            uint lineNumber = 0;
            using (var reader = File.OpenText(firstFile))
            using (var writer = File.CreateText(resultFile))
                foreach (string line in GetLines(reader))
                {
                    if (lineNumber == thirdData[index])
                    {
                        writer.WriteLine(line);
                        index++;
                    }
                    if (index == thirdData.Count) break;
                    lineNumber++;
                }
        }
    }
}
Program.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System;
 
namespace ConsoleApplication7
{
    class Program
    {
        static void Main(string[] args)
        {
            var logic = new Logic();
            logic.ProcessingFiles("file1.txt","file2.txt","result.txt", 100,1000000);
            Console.ReadKey();
        }
    }
}
0
1 / 1 / 0
Регистрация: 11.09.2015
Сообщений: 25
11.12.2015, 14:39  [ТС]
агерон, ну, вроде, понятно. Пока не проверял код, с телефона сижу. Вот такой вопрос еще возник, как измениться этот код, если мне для строчки уже надо будет выполнить такие условия, чтобы 10 символов совпадали в диапазоне 100-500, девять - 500-1500, восемь - 1000 - 5000.
Здесь понятно
C#
1
2
3
4
5
6
7
8
9
public void ProcessingFiles(string firstFile, string secondFile, string resultFile, int minCountLine, int maxCountLine)
        {
            var firstData = GetFirstData(firstFile);
            var secondData = GetSecondData(secondFile);
            secondData.IntersectWith(firstData.Keys);
            var thirdData =
                secondData.Select(x => firstData[x])
                    .Where(y => y.Count >= minCountLine && y.Count <= maxCountLine).Select(z => z[0])
                    .ToList();
А вот тут как?
C#
1
2
3
4
5
6
7
8
public IEnumerable<string> GetHashLines(StreamReader reader)
        {
            while (!reader.EndOfStream)
            {
                var str = reader.ReadLine();
                yield return str.Substring(0, 10);
            }
        }
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
11.12.2015, 15:00
что ж ты там такое обрабатываешь? что условия постоянно меняются....

Добавлено через 13 минут
внятное задание выложи
0
1 / 1 / 0
Регистрация: 11.09.2015
Сообщений: 25
11.12.2015, 19:01  [ТС]
агерон, Дал упрощенное условие, чтоб сильно не напрягать, думал, потом сам разберусь, переделаю для себя, но непонятен стал этот момент. Поэтому даю полное (попытаюсь объяснить) описание.
Есть 2 текстовых файла, в каждом из которых есть неопределенное кол-во строк. Каждая строка составляет ровно 17 символов. Нужно для каждой строки из первого файла произвести перебор всех строк из второго. В строках сравнивается каждый символ, и отмечаются 15, 14, 13, 12 и 11 совпадений символов в строке (из 17). Далее подсчитываем сколько раз у нас было 15 , 14, 13, 12 и 11 совпадений для нашей строки из первого файла, и если эти совпадения входят в диапазон (0 < 15 совпадений < 100; 150 < 14 совпадений < 500; 570 < 13 совпадений < 1000; 1020 < 12 совпадений < 1500; 1700 < 11 совпадений < 2500), то записываем эту строку в новый файл. Переходим на вторую и проделываем те же операции. И так до последней строки включительно.
Нарисовал, может так понятней будет.
Миниатюры
Как использовать оперативную память рационально?  
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
12.12.2015, 03:09
это что олимпиадная задача?

Добавлено через 43 секунды
пример файла сложно приложить?
0
1 / 1 / 0
Регистрация: 11.09.2015
Сообщений: 25
12.12.2015, 16:05  [ТС]
агерон, не олимпиадная. Вот пример
Вложения
Тип файла: rar 1.rar (870.8 Кб, 3 просмотров)
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
12.12.2015, 22:16
все равно фиг поймешь что это за цифры давай внятное задание с объяснением что это за данные а то я таких цифр сам на генерировать на терабайт могу
0
1 / 1 / 0
Регистрация: 11.09.2015
Сообщений: 25
13.12.2015, 11:58  [ТС]
агерон, Куда еще внятнее? Просто сгенерированный набор цифр. И какая разница, что лежит в этих файлах? Мне кажется, я довольно понятно объяснил, что мне нужно. Даже показал. А толку?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10428 / 5158 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
13.12.2015, 13:04
igorigrok, Думаю ваша задача не имеет решения в смысле оптимизации алгоритма.
Фактически вам нужно найти все близкие векторы к данному вектору. В 17-мерном пространстве и с хитрой метрикой. Теоретически, для этого используются многомерные деревья (например октодерево для 3-х мерного пространства). Но из-за того, что размерность пространства очень высока - думаю эффективность дерева будет очень низкой. Плюс очень хитрые критерии близости. Плюс большое количество векторов.
Получается, как ни крути, сложность будет O(n*m) и от этого никуда не деться. А значит всегда будет два вложенных цикла и вопрос может стоять только про оптимизацию чисто техническую (например распараллеливание, использование unsafe кода и указателей, отказ от строк в пользу массива байт и т.д.).
Либо же, нужно подняться на уровень выше и посмотреть что за задачу вы решаете, и попытаться ее решить другими методами - без этой метрики и без этих многомиллионных файлов.

Что касается вашего кода в посте #38 то там опять же ошибки. Создаются непонятно зачем пустые массивы и их значения зачем-то сравниваются.
Тело внутреннего цикла должно быть примерно таким:
C#
1
2
3
4
5
6
7
8
9
10
                        var s1 = list1[j];
                        var s2 = list2[i];
                        
                        for (int k = 0; k < 17; k++)
                        {
                            if (s1[k] == s2[k])
                            {
                                s++;
                            }
                        }
1
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
13.12.2015, 14:12
потому что мне кажеться что это олимпиадная задача, и после того как тебе решат задачу в текущем срезе ты будешь подкидывать и подкидывать условия чтобы ее решить окончательно а это не есть гуд т. к. сушить сообществу голову ради того чтобы ты получил балы на topcoder не есть хорошо

Добавлено через 2 минуты
так что я жду внятного объяснения что это за цифры и какая на самом деле задача оптимизации перед тобой стоит
0
1 / 1 / 0
Регистрация: 11.09.2015
Сообщений: 25
13.12.2015, 15:04  [ТС]
агерон, веришь, нет, но я даже про topcoder не слышал никогда. Я не программист, и лезть в какие-то олимпиады мне смысла нет. Из школьной программы только помню немного бейсик, в универе один семестр было программирование и то только Pascal ABC. C# сам осваиваю (пытаюсь) ради одной программы, которая в принципе готова. Меня не устраивала скорость ее именно на этом этапе, поэтому и спросил. Цифры - это просто цифры, которые генерируются чуть раньше. Что за программа и какое ее назначение я говорить не буду.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
13.12.2015, 18:14
агерон, хватит обижать незнакомых людей своей подозрительностью. Задача сформулированна была вполне явно, есть возможность ответить - отвечайте, нет - пройдите мимо. Смысл говорить человеку, что его задача - туфта, и великий специалист-форумчанин не собирается тратить свое божественное время на понимание его никчемных нюансов.

Добавлено через 3 минуты
igorigrok, как выше уже ответили, быстрее чем за N2 решить хз как, по крайней мере мы с моим другом пытались придумать алгоритм, но ничего толкового из этого не вышло. Он клянется, что можно за nlogn сделать, но я думаю там будет такая константа, что проще обычный алгоритм "в лоб" применить.
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
13.12.2015, 21:51
Psilon, Сравнение 2х текстовых файлов построчно каждый символ
Все просто Psilon это не подозрение а уверенность что задача как минимум не адекватная, даже больше того скорее всего надуманная, если разобрать его ник на две составляющие, igorigrok, то получиться Игорь-игрок считай меня за параноика но тут 100% замешан быстрый способ "обогащения" или туфта типа выигрышных номеров лото или какие то позиции в картах для покера либо еще какая либо хрень подобная, по сути эту тему он мусолит с сентября и все не может решить, все надеться что ему предсказателя напишут и он миллион выграет

Вот поэтому я хочу знать откуда эти числа появились и что реально стоит за этой обезличенной задачей, потому как внятный заказчик не будет так шифровать происхождение данных
0
1 / 1 / 0
Регистрация: 11.09.2015
Сообщений: 25
13.12.2015, 22:56  [ТС]
агерон, "Агерон", если загуглить, то это препарат от старения... считайте меня параноиком, но тут 100% реклама товара... И каждый раз флудить, заострять внимание, это все для самопиара. Чтоб врезался ник в память. Все надеется, что кто-то все же купит.
Говорю же, задача была решена. И работает программа нормально. Я просто хотел ее ускорить. Насчет шифровки. Дал изначально упрощенное условие для того, чтобы получить хоть какой-то ответ. Если рассудить логически, вероятность того, что кто-то ответит на полную задачу со всеми ее вытекающими в десятки раз меньше, чем на ту, которая сведена к минимуму (максимально упрощенна).
А твой, через чур активный, интерес к моей задаче, как минимум настораживает. Не хочешь ли ты украсть мою идею, с целью быстрого "обогащения"? Уж очень активно интересуешься. Не продается Агерон видимо. (Это сарказм, чтоб понятней было, а то вдруг скажешь, что я "невнятно" написал.
Psilon, Спасибо за ответ.
Всем спасибо за решение данного вопроса. Тему можно считать закрытой, дабы не превращать это все в чат, все, что интересовало, я получил.
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
13.12.2015, 23:08
Psilon, Вот и думай над такой поспешностью закрытия темы, тема уже неделю жила а тут через час после моего сообщения TC кричит "закрывайте срочно тему!!!" по неволе задумаешься ....
Кто прав кто виноват решайте сами....

Igorigrok а если на то пошло идеи не патентуются, патентуются конкретные реализации и ник Агерон я начал использовать в 2001 году в универе, когда и слыхом не слыхивал про геропротектор 2-го поколения, под влиянием "Властелина колец"
0
1 / 1 / 0
Регистрация: 11.09.2015
Сообщений: 25
14.12.2015, 07:19  [ТС]
агерон, Поясню для тебя последний раз. Странно, что ты смотришь только в одном направлении. Я даже тебе аналогичный пример привел, но ты упорно ничего не замечаешь. Почему я решил закрыть тему, посмотри выше. Здесь по существу сообщений 10. Все остальное превращается во флуд. Все, кто мог мне ответить, уже ответили. Вопрос для тебя. Кого еще мне ждать? Случайного форумчанина, который зайдет, не обращая внимания на всю "воду", пролистает каждую страницу, вникнет в задачу и что-нибудь скажет? Тема давно помечена, как получившая ответ. А сейчас еще и жирным выделена, как глобальной важности. Не думаю, что кто-то новый что-либо еще добавит сюда. Все, кто здесь был своими сообщениями отметились. ЭтоPsilon, Storm23, и даже ты. Первые два по существу, а ты начал искать "заговор". Может ты ждешь, что я умолять тебя буду, чтоб ты написал мне как это делается? И на тебя наконец снизойдет милость царская. Нет, этого не будет. Это того не стоит. За 3 дня без активности, тема спуститься вниз. И зайдет в нее только редкий гость. Закрываю я тему, дабы не превращать ее в мусор, как ты сделал в самом начале. И как продолжаешь делать сейчас.
Что касается ника... Может у меня тоже особая история с ним связана?
Не такая глобальная, как у тебя. А может меня так в детстве родители называли, когда не слышали про слово "геймер". А кто-нибудь из друзей услышал и подхватил, так и прижилось. А еще лучше оно с именем сочитается Игорь Игрок (набор букв почти одинаков, за исключением одной)

Надеюсь, теперь понятно?
Больше я тебе ничего объяснять не буду. И вступать в "дебаты" тоже не собираюсь.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.12.2015, 07:19

Опасно ли использовать оперативную память без VREF
Всем привет.У меня есть планка ddr 2 на 2 гигабайта.И у неё оторвался маленький конденсатор.Он соединялся с дорожкой,которая идёт к 1...

Возможно ли серверную оперативную память использовать на рабочей станции?
Есть рабочая станция на матери ASUS H61M-D. И камень i7-3770 3.4GHz. Мать имеет 2 гнезда оперативки. В гнёздах стоит по 8 гб на слот. (в...

Как более рационально использовать контрол для справочника?
Есть контрол DropDownList он показывает около 150 значений (например города) и таких разных контронов несколько. Но этот контол должен...

Как освободить оперативную память?
у меня 2 гб оперативы,ос windows 7(x32)которая сжирает почти 1 гб оперативы что можно сделать чтоб освободить оперативную память?

Как поставить оперативную память!?
Доброго времени суток! Подскажите пожалуйста, как поставить оперативную память? На Ноут.Hp 625. Стоит 2Гб, а хочу запихать 4Гб. Micron...


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

Или воспользуйтесь поиском по форуму:
56
Ответ Создать тему
Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru