Задать вопрос
KirillHelm
@KirillHelm

Превышение объёма памяти в C#?

Всем добрый вечер! Учу по не многу C#. Решил накалякать генератор чисел, не буду вдаваться в его суть, а лучше расскажу о загвоздке. Красота эта генерирует порядка 10'000'000'000 чисел, всю эту гадость хотелось бы держать непосредственно в самой программе, перед тем как выводить в файл. Мало того, есть случаи когда это число может увеличится в несколько раз.

Было принято решение запихать всё это безобразие не в list< string > как было раньше, а в list< list < string > >, но существенно, это мало на что повлияло, хотя количество вмещаемых чисел удвоилось (выяснилось экспериментальным путём).
Но всё же при создании более 2х массивов внутри основного вылетает ошибка:
"System.OutOfMemoryException" в mscorlib.dll

Тогда в голову пришла другая идея: сделать массив с указателями на экземпляры класса list< string >. Мне показалось, что тогда раз уж в списке содержаться просто адреса других массивов, а не они сами, то в теории должно всё получиться.
Но данная затея ни к чему не привела, так как работа с указателями в c# существенно отличается от c++ (с него начинал учиться, а в c# с указателями пока не сталкивался).

Прошу совета! Подскажите как сделать массив указателей на list'ы или более разумный метод работы с массивами по 10млрд. чисел в каждом.

Постскриптум
Функции поочерёдно запускаются в отдельном от основного потоке, сначала BuildNumbers, после того как она отработает CreateOperators. Не серчайте на меня из-за, возможно, бредовости затеи, но по не многу разрабатывая такие бесполезные утилиты сталкиваюсь с интересными проблемами как эта и хотелось бы соображать, как такое решить.
Немного кода не помешает:

static public List<string> Numbers { get; set; }
static public List<List<string>> OutputNumbers { get; set; }

static public void BuildNumbers(int NumberLegth, int UpperRange, int BottomRange)
        {
            Numbers = new List<string>();
            for (long i = 0; i < BottomRange; i++)
            {
                string number = i.ToString();
                if (number.Length < NumberLegth)
                {
                    for (int j = number.Length; j < NumberLegth; j++)
                    {
                        number = number.Insert(0, "0");
                    }
                }
                Numbers.Add(number);
            }
        }

static public void CreateOperators(List<string> Operators, int CountryCode)
        {
            OutputNumbers = new List<List<string>>();
            string Country = "";
            if (CountryCode > 0)
            {
                Country = DATA.Code[CountryCode].ToString();
            }
            for (int i = 0; i < Operators.Count; i++)
            {
                OutputNumbers.Add(new List<string>());
                                
                for (int j = 0; j < Numbers.Count; j++)
                {
                    OutputNumbers[i].Add(Numbers[j].Insert(0, Country + Operators[i]));        //вот тут и вылазит трабл...
                }
            }
            Numbers.Clear();            
        }
  • Вопрос задан
  • 627 просмотров
Подписаться 1 Оценить 2 комментария
Решения вопроса 1
@none7
Если выводить в файл это единственное, что нужно делать с данными, то лучше генерировать их по необходимости. Так памяти много не понадобиться.
public static IEnumerable<string> GetNumbersRange (int numberLength, int start, int end)
{
    string format = "D" + numberLength;
    for (int i = start; i < end; i++)
        yield return i.ToString(format);
}

public static IEnumerable<string> GetOperatorNumbers(IEnumerable<string> operators, IEnumerable<string> numbers, int countryCode)
{
    string Country = "";
    if (countryCode > 0)
    {
        Country = DATA.Code[countryCode].ToString();
    }

    foreach (var op in operators)
        foreach (var num in numbers)
            yield return Country + op + num;
}

File.AppendAllLines("file.txt", GetOperatorNumbers(...));
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@d-stream
Готовые решения - не подаю, но...
А какие действия подразумеваются над этими дофигачислами? Почему именно List, а не массивы например?

Ну и вот это: https://msdn.microsoft.com/en-us/library/hh285054.aspx
Ответ написан
@John_Nash
coder
можно увеличить размер файла подкачки или докупить модулей памяти, если так критично хранить в виде list< list < string > > и не сталкиваться с OutOfMemoryException.
Разумеется, нужно запускать все это в 64разрядной среде
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы