- Регистрация
- 30.11.2020
- Сообщения
- 496
- Благодарностей
- 314
- Баллы
- 63
Добрый день форум. Прошу совета как решить следующую проблему
Имеется следующий генератор, который выдает все возможные значения из вводных данных
В текущем случае это предоставление всех возможных комбинаций в 22 ячейках каждая из которых принимает одно из 8 состояний
Претензий к самой работе кода нет, но вытекают проблемы следующего плана
Основная проблема это обьем данных. Так как всего ячеек 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 вариантов, записывал в файл текущее положение рассчета и при перезапуске ПРОДОЛЖАЛ с места остановки рассчета, а не начинал его заново? Почти неделя "курю форумы" скоро выплюну меха, но адекватного ответа или варианта так и не нашел.
Спасибо
Имеется следующий генератор, который выдает все возможные значения из вводных данных
В текущем случае это предоставление всех возможных комбинаций в 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 вариантов, записывал в файл текущее положение рассчета и при перезапуске ПРОДОЛЖАЛ с места остановки рассчета, а не начинал его заново? Почти неделя "курю форумы" скоро выплюну меха, но адекватного ответа или варианта так и не нашел.
Спасибо