Как сохранить промежуточное состояние генератора для дальнейшего перезапуска

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
314
Баллы
63
Добрый день форум. Прошу совета как решить следующую проблему
Имеется следующий генератор, который выдает все возможные значения из вводных данных
В текущем случае это предоставление всех возможных комбинаций в 22 ячейках каждая из которых принимает одно из 8 состояний

C#:
using (var writer = new StreamWriter(new BufferedStream(File.OpenWrite(@"C:\Users\Maersk\Desktop\outlist.txt"), 10 * 1024 * 1024)))
{
  string[] a_s =
    {
        "011001", "010101", "100101", "010110", "101010", "011010", "100110", "101001"
    };
    ulong m = 8, n = 22;
    for (ulong i = 0; i < Math.Pow(m, n); i++)
    {
        string s = "";
        ulong ii = i;
        for (ulong j = 0; j < n; j++)
        {
            s = a_s[ii % m] + s;
            ii /= m;
        }
        writer.WriteLine(s);
    }
}
Претензий к самой работе кода нет, но вытекают проблемы следующего плана
Основная проблема это обьем данных. Так как всего ячеек 22 каждая из которых может принимать одно из 8 состояний, то имеем общее количество вариантов 22^8 = 54 875 873 536 вариантов. Каждый вариант строковый который весит 1384 бита (129 байт). Таким образом, общий вес файла будет составлять 9 438 650 248 192 байта, или в пересчете на терабайты, приблизительно 8,58 Тб. Это обстоятельство усугубляется тем, что данные значения предварительные и подлежат обработке, после которой, каждая строка увеличивается в 6 раз. Конечно StreamReader умеет обрабатывать файлы любого размера, но у меня тупо нет такого объема памяти на дисках чтобы записать 54 875 873 536 вариантов предварительных данных.
************
Как можно поправить код таким образом, чтобы он, к примеру, выдавал данные порционно, допустим по 1 000 000 000 вариантов, записывал в файл текущее положение рассчета и при перезапуске ПРОДОЛЖАЛ с места остановки рассчета, а не начинал его заново? Почти неделя "курю форумы" скоро выплюну меха, но адекватного ответа или варианта так и не нашел.
Спасибо
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
i и j сохраняй в файле стороннем и при запуске считывай из этого файла и стартуй циклы не с нуля как сейчас, а с этих самых значений.
 
  • Спасибо
Реакции: DevOps и Astraport

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
314
Баллы
63
i и j сохраняй в файле стороннем и при запуске считывай из этого файла и стартуй циклы не с нуля как сейчас, а с этих самых значений.
Я не могу задать количество выполнений, допустим тот же 1 000 000 000 по счетчику. Код работает в цикле "до упора", ну и плюс еще вложенный цикл
PS В принципе "допер", спасибо, буду пробовать
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Я не могу задать количество выполнений, допустим тот же 1 000 000 000 по счетчику. Код работает в цикле "до упора", ну и плюс еще вложенный цикл
PS В принципе "допер", спасибо, буду пробовать
можно добавить еще один счетчик, который будет увеличиваться при каждой записи и на него повесить условие 1 000 000 000 , при срабатывание которого будет прерываться цикл и сохраняться состояние i и j
 
  • Спасибо
Реакции: DevOps

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
314
Баллы
63
можно добавить еще один счетчик, который будет увеличиваться при каждой записи и на него повесить условие 1 000 000 000 , при срабатывание которого будет прерываться цикл и сохраняться состояние i и j
Да, я именно так и догадался с Вашего первого коммента, спасибо
Буду сейчас тестить
 

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
314
Баллы
63
Вопрос закрыт
!ОШИБКА!

Количество состояний не 22^8 а 8^22
Это 73 786 976 294 838 206 464 вариантов, расчет займет несколько лет
 
  • Спасибо
Реакции: djaga и edbaz

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)