Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.98/43: Рейтинг темы: голосов - 43, средняя оценка - 4.98
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676

Ботлнек String/StringBuilder

22.11.2020, 08:42. Показов 11627. Ответов 220
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
обсуждение, начавшееся в другой теме переношу сюда. Самой тяжёлой является операция:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
string source = File.ReadAllText(@"d:\work\words\source.txt", Encoding.GetEncoding(1251));
var sb_source = new StringBuilder(source, Source.Length);
Dictionary<string, int> F = new Dictionary<string, int>();
// ---
// тут вставляем код заполнения F, у меня получается около 70000 пар
// заполнение происходит очень быстро
// ---
foreach (var elem in F)
{
    // а вот тут был string и работало это, как мы все понимаем 200 лет
    // теперь тут StringBuilder, работает быстрее, но не слишком
    // можно сделать Parallels.ForEach, для моего i5 ускорится в ~4 раза
    sb_source = sb_source.Replace(elem.Key, "\0\0\0");
};
Нолики "\0" - это классификатор отсутствия информации, то есть после нескольких итераций на выходе будет файл полностью забитый нулями. Это один из показателей верности работы алгоритма.
Получается для файла в 4 мб (гигабайты я пока использовать не стал) это 4*70000=280000 Мбайт чтения и поменьше записи в памяти. Возможно стоит перевести на массив byte[] или ulong[] и делать замену вручную.

Добавлено через 10 минут
Цитата Сообщение от belalugoci Посмотреть сообщение
можно сделать Parallels.ForEach, для моего i5 ускорится в ~4 раза
StringBuilder также не является потокобезопасным, поэтому его работа с параллельными потоками недопустима.
Видимо нельзя
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.11.2020, 08:42
Ответы с готовыми решениями:

List<string, string, string> есть ли в C# что-то подобное?
Мне надо добавить в List не только имя файла, но и некоторые строки из этого файла. Т.е. например, у меня есть в определенном директории...

StringBuilder и регулярки
Подскажите, можно ли на StringBuilder использовать RegEx.Replace? Если да, то как?

Подскажите как дешифровать текст с использованием StringBuilder
Дана строка, содержащая зашифрованный русский текст. Каждая буква заменяется на следующую за ней (буква я заменяется на а). Получить новую...

220
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
23.11.2020, 14:41  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от belalugoci Посмотреть сообщение
результаты выложу позже, но стало медленнее
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
String+StringBuilder    String+StringBuilder    byte[]+byte[]
Core i5-3570            Core i5-4470            Core i5-4470
[00:00.0000]            [00:00.0000]            [00:00.0000]    BEGIN
[00:00.0008]            [00:00.0007]            [00:00.5937]    Freq3: считаем частоты
[00:04.9290]            [00:10.0209]            [00:18.6181]    Частот пройдено: 0 : 1000000000
[00:09.2775]            [00:12.8250]            [00:21.7448]    Частот пройдено: 10000000 : 1000000000
[00:13.5592]            [00:15.7296]            [00:24.5689]    Частот пройдено: 20000000 : 1000000000
...
[07:03.6675]            [05:18.7391]            [05:54.0502]    Частот пройдено: 980000000 : 1000000000
[07:07.9217]            [05:21.9179]            [05:57.2668]    Частот пройдено: 990000000 : 1000000000
[07:12.1775]            [05:25.1216]            [06:00.4947]    Freq3: сортируем частоты
[07:12.1810]            [05:25.3944]            [06:00.9330]    Freq3: заменяем нулями текст вывода
[08:07.3789]            [06:49.8608]            [07:29.1648]    Freq3: сериализуем DAT
[08:07.4586]            [06:51.1780]            [07:31.1395]    Объект FreqOrdered3 сериализован
[08:07.4739]            [06:51.1843]            [07:31.6249]    Freq3: формируем текстовый вариант
[08:07.4743]            [06:51.3398]            [07:31.9029]    Freq3: сохраняем частоты
[08:07.5544]            [06:51.6656]            [07:34.1037]    Freq3: очищаем память
Так как на мелком файле разница малозаметна, то зарядил 1 Гб файл. Время в минутах. Первый столбец это мой домашний, потом два столбца с работы, средний это Dictionary<string, int> в качестве ключей и StringBuilder хранит сам 1 Гб файл.
А правый это Dictionary<byte[], int> и byte[].
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,044
23.11.2020, 14:48
belalugoci, на самом деле для нас эти замеры не особо важны. Важен код.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
23.11.2020, 14:56  [ТС]
Скажете если что-то нужно объяснить. Это код из таблицы для столбцов String+StringBuilder, сейчас вариант с байтами оформлю.
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
string source = File.ReadAllText(@"d:\work\words\a.txt", Encoding.GetEncoding(1251));
int len = source.Length;
var sb_source = new StringBuilder(source, len);
byte[] byte_source = System.Text.Encoding.GetEncoding(1251).GetBytes(source);
Dictionary<string, int> Freq3 = new Dictionary<string, int>();
Dictionary<string, int> FreqOrdered3 = new Dictionary<string, int>();
int totalbyte = 3;
for (int i = 0; i < len - 2; i++)
{
    string codesym = "";
    var iii = totalbyte;
    int dx = 0;
    while (iii > 0)
    {
        codesym += sb_source[i + dx++].ToString();
        iii--;
    }
    if (!Freq3.ContainsKey(codesym))
        Freq3.Add(codesym, 1);
    else
        Freq3[codesym]++;
}
FreqOrdered3 = Freq3.OrderByDescending(x => x.Value).ToDictionary(x => x.Key, x => x.Value);
byte[] codesym_byte = new byte[3];
int i2 = 0;
while (i2 < (len - 2))
{
    codesym_byte[0] = byte_source[i2];
    codesym_byte[1] = byte_source[i2 + 1];
    codesym_byte[2] = byte_source[i2 + 2];
    if (FreqOrdered3.ContainsKey(Encoding.GetEncoding(1251).GetString(codesym_byte)))
    {
        byte_source[i2] = 0;
        byte_source[i2 + 1] = 0;
        byte_source[i2 + 2] = 0;
        i2 += 2;
    }
    i2++;
}
Добавлено через 43 секунды
Цитата Сообщение от Usaga Посмотреть сообщение
на самом деле для нас эти замеры не особо важны. Важен код.
Согласен, это для истории )
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,044
23.11.2020, 15:00
Цитата Сообщение от belalugoci Посмотреть сообщение
string source = File.ReadAllText(@"d:\work\words\a.txt", Encoding.GetEncoding(1251));
int len = source.Length;
var sb_source = new StringBuilder(source, len);
byte[] byte_source = System.Text.Encoding.GetEncoding(1251).G etBytes(source);
Уже жесткач. Первая строка выгружает в ОЗУ файл целиком. Третья строка снимает с этих данных копию. Последняя строка делает ещё копию. Если файл размером с гигабайт, то представляю расход оперативной памяти.
1
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
23.11.2020, 15:00  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Дефолтный Dictionary так же поддерживает получение компаратора в конструкторе
Так сделал, выше показали как нужно.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если у вас не предусматривается длина ключей более 8 байт, то возможно более оптимальным будет использовать long и небезопасный код.
вполне может быть, посмотрите код выше, возможно получится что-то с ним сделать.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Из этого следует, что нет необходимости совершать для каждого ключа отдельный проход по потоку. Всё можно сделать в одном проходе но несколько более сложным алгоритмом.
Сомневаюсь. Сбор информации происходит за 1 проход, только после этого есть возможность совершить второй проход с другим алгоритмом, при этом словарь изменится. И так нужно делать пока словарь не перестанет меняться. Поэтому я и написал что в лучшем варианте это O(n!).
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,044
23.11.2020, 15:02
Цитата Сообщение от belalugoci Посмотреть сообщение
while (iii > 0)
    {
        codesym += sb_source[i + dx++].ToString();
        iii--;
    }
Конкатенация в цикле. Это - тонны мусора и работы для GC. Ещё и бесполезное преобразование отдельных символов в строку. Дополнительный мусор.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
23.11.2020, 15:04  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Уже жесткач. Первая строка выгружает в ОЗУ файл целиком. Третья строка снимает с этих данных копию. Последняя строка делает ещё копию. Если файл размером с гигабайт, то представляю расход оперативной памяти.
вижу это, в 5 гб укладывается. Если свести до 2 гб то ровным счетом ничего не изменится кроме факта использования меньшего объема памяти, а сейчас это не важно.

Добавлено через 57 секунд
Цитата Сообщение от Usaga Посмотреть сообщение
Конкатенация в цикле. Это - тонны мусора и работы для GC. Ещё и бесполезное преобразование отдельных символов в строку. Дополнительный мусор.
я не смогу оформить лучше.
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,044
23.11.2020, 15:05
Цитата Сообщение от belalugoci Посмотреть сообщение
вижу это, в 5 гб укладывается. Если свести до 2 гб то ровным счетом ничего не изменится кроме факта использования меньшего объема памяти, а сейчас это не важно.
Это уже супернеэффектиный код. На эти переливания данных в оперативке уже время уходит и память. Этого не должно быть.

Добавлено через 24 секунды
Цитата Сообщение от belalugoci Посмотреть сообщение
я не смогу оформить лучше.
Вы знаете про StringBuilder. Вы можете оформить лучше.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
23.11.2020, 15:07  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Это уже супернеэффектиный код
ну я такое не учитываю, это в самом начале происходит и занимает всегда неизменное время в 5-6 секунд. Я не спорю с вами, просто считаю что это легко устраняется и недостойно внимания.

Цитата Сообщение от Usaga Посмотреть сообщение
Вы знаете про StringBuilder. Вы можете оформить лучше.
Так, идею понял. Сейчас переделаю.
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,044
23.11.2020, 15:14
while (i2 < (len - 2))
{
codesym_byte[0] = byte_source[i2];
codesym_byte[1] = byte_source[i2 + 1];
codesym_byte[2] = byte_source[i2 + 2];
if (FreqOrdered3.ContainsKey(Encoding.GetEn coding(1251).GetString(codesym_byte)))
Вот тут тоже малый мусор создаётся.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
23.11.2020, 15:30
Цитата Сообщение от belalugoci Посмотреть сообщение
Так, идею понял. Сейчас переделаю.
У вас StringBuilder используется ровно 1 раз и то это можно заменить...
Удалить
C#
1
var sb_source = new StringBuilder(source, len);
Заменить
C#
1
codesym += sb_source[i + dx++].ToString();
на
C#
1
codesym += source[i + dx++].ToString();
Это тоже непонятно зачем нужно:
C#
1
byte[] byte_source = System.Text.Encoding.GetEncoding(1251).GetBytes(source);
Можно удалить, оставить код со StringBuilder и заменять символы в нем:
C#
1
2
3
        sb_source[i2] = '\0';
        sb_source[i2 + 1] = '\0';
        sb_source[i2 + 2] = '\0';
Не до конца исправленный код из поста выше
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
string source = File.ReadAllText(@"d:\work\words\a.txt", Encoding.GetEncoding(1251));
int len = source.Length;
var sb_source = new StringBuilder(source, len);
//byte[] byte_source = System.Text.Encoding.GetEncoding(1251).GetBytes(source);
Dictionary<string, int> Freq3 = new Dictionary<string, int>(); // заменить на Dictionary<char[], int> с соответствующим компаратором
Dictionary<string, int> FreqOrdered3 = new Dictionary<string, int>(); // заменить на Dictionary<char[], int> с соответствующим компаратором
int totalbyte = 3;
char[] codesum = new char[totalbyte];
for (int i = 0; i < len - 2; i++)
{
    //string codesym = "";
    var iii = totalbyte;
    int dx = 0;
    while (iii > 0)
    {
        codesym[dx++] = sb_source[i + dx++];
        iii--;
    }
    if (!Freq3.ContainsKey(new string(codesym))) // тут можно было бы использовать словать Dictionary<char[], int> с соотвествующим компаратором чтобы не плодить строки...
        Freq3.Add(codesym, 1);
    else
        Freq3[codesym]++;
}
FreqOrdered3 = Freq3.OrderByDescending(x => x.Value).ToDictionary(x => x.Key, x => x.Value);
char[] codesym_byte = new char[3];
int i2 = 0;
while (i2 < (len - 2))
{
    codesym_byte[0] = sb_source[i2];
    codesym_byte[1] = sb_source[i2 + 1];
    codesym_byte[2] = sb_source[i2 + 2];
    if (FreqOrdered3.ContainsKey(new string(codesym_byte))) // тут можно было бы использовать словать Dictionary<char[], int> с соотвествующим компаратором чтобы не плодить строки...
    {
        sb_source[i2] = '\0';
        sb_source[i2 + 1] = '\0';
        sb_source[i2 + 2] = '\0';
        i2 += 2;
    }
    i2++;
}
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
23.11.2020, 15:37  [ТС]
Сейчас переделаю.
было
C#
1
2
3
4
5
6
7
var iii = totalbyte;
int dx = 0;
while (iii > 0)
{
    codesym += sb_source[i + dx++].ToString();
    iii--;
}
время выполнения [07:12.1775]
стало
C#
1
string codesym = sb_source.ToString(i, 3);
время выполнения [04:04.5412]
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,044
23.11.2020, 15:42
Цитата Сообщение от Someone007 Посмотреть сообщение
// тут можно было бы использовать словать Dictionary<char[], int> с соотвествующим компаратором чтобы не плодить строки...
А лучше ArraySegment<char> или Span<char>
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
23.11.2020, 16:31  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
codesym[dx++] = sb_source[i + dx++];
тут ошибка будет, итераций в 2 раза больше. полагаю что в codesym[dx++] нужно заменить на dx.

Цитата Сообщение от Someone007 Посмотреть сообщение
Не до конца исправленный код из поста выше
В таком виде исполнялось практически идентично с вариантом byte[].
0
Just Do It!
 Аватар для XLAT
4220 / 2685 / 656
Регистрация: 23.09.2014
Сообщений: 9,241
Записей в блоге: 3
23.11.2020, 17:50
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Не читал все посты.
и я тоже не читал, но осуждаю:
Цитата Сообщение от belalugoci Посмотреть сообщение
sb_source.Replace(...
Replace, как никудышний по скорости алгоритм для множественной замены.

тут пруф:
https://www.cyberforum.ru/post14441679.html
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
23.11.2020, 18:05  [ТС]
Цитата Сообщение от XLAT Посмотреть сообщение
Replace, как никудышний по скорости алгоритм для множественной замены.
почитаю, но такой команды уже нет в коде, оптимизируем потихоньку.
0
Just Do It!
 Аватар для XLAT
4220 / 2685 / 656
Регистрация: 23.09.2014
Сообщений: 9,241
Записей в блоге: 3
23.11.2020, 18:37
Цитата Сообщение от belalugoci Посмотреть сообщение
почитаю, но такой команды уже нет в коде, оптимизируем потихоньку.
самое главное понять почему он медленный.
а то можно и своё наворотить в таком же реплейснутом духе
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
23.11.2020, 18:44
Цитата Сообщение от belalugoci Посмотреть сообщение
вполне может быть, посмотрите код выше, возможно получится что-то с ним сделать.
Я не совсем понимаю, что делает ваш код.
В первом цикле вроде просто собирает статистику для заданной длины ключа.
Если правильно понял, то что-то подобное:
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
    public class FreqPair
    {
        public ulong Key { get; }
        public int Count { get; set; }
 
        public FreqPair(ulong key) => Key = key;
 
        public FreqPair(ulong key, int count)
            : this(key)
            => Count = count;
    }
    public class FreqTextAscii
    {
        public unsafe static IDictionary<ulong, FreqPair> GetFreqs(string fileName, int keyLength)
        {
            if (keyLength < 1 || keyLength > 8)
                throw new ArgumentOutOfRangeException(nameof(keyLength));
 
            byte[] source = File.ReadAllBytes(fileName);
 
            Dictionary<ulong, FreqPair> freqs = new Dictionary<ulong, FreqPair>();
            ulong key = 0;
            byte* keyBytes = (byte*)&key;
 
            // Формирование первого ключа
            for (int i = 0; i < keyLength; i++)
            {
                *(keyBytes + i) = source[i];
            }
            freqs.Add(key, new FreqPair(key, 1));
 
            for (int i = keyLength; i < source.Length; i++)
            {
                *(keyBytes + keyLength - 1) = 0;
                key <<= 8;
                *keyBytes = source[i];
 
                if (freqs.TryGetValue(key, out FreqPair pair))
                    pair.Count++;
                else
                    freqs.Add(key, new FreqPair(key, 1));
 
            }
 
            return freqs;
        }
    }
Но вот, что делать дальше с этими ключами - не понимаю.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
23.11.2020, 18:53  [ТС]
Цитата Сообщение от XLAT Посмотреть сообщение
Replace, как никудышний по скорости алгоритм для множественной замены.
думаете Replace в C# такой же как и в C++?
0
Just Do It!
 Аватар для XLAT
4220 / 2685 / 656
Регистрация: 23.09.2014
Сообщений: 9,241
Записей в блоге: 3
23.11.2020, 18:59
Цитата Сообщение от belalugoci Посмотреть сообщение
думаете Replace в C# такой же как и в C++?
алгоритмы - они и в африке алгоритмы!

хотите быстро?
и не боитесь использовать в вашем C# динамические библы, тогда вот вам в помощь:
https://habr.com/ru/post/347352/

ну это просто вариант,
так как я плохо знаю андеграунд шарпа, то мне бы подошёл, тем более когда всё критично...
а ваще на будущее этот вариант, если вы его обкатаете, то может даже очень и очень пригодиться!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.11.2020, 18:59

Невозможно очистить StringBuilder после исключения OutOfMemoryException
Привет всем. Делаю небольшой текстовый редактор и натолкнулся на следующую проблему: при загрузке достаточно большого файла через...

StringBuilder: Строка не корректно создается, перемешиваются все поля
приложение клиент-сервер. клиент создает запрос на сервер, сервер с помощью StringBuilder из словаря формирует строку для передачи по...

В чем разница между StringWriter и StringBuilder и когда нужно использовать эти классы?
Подскажите, пожалуйста, в чем разница между StringWriter и StringBuilder и когда нужно использовать эти классы? То, что есть в этих...

Несколько вопросов по примеру из книги по C# про строки (string и String.Format)
Я нашел такой пример кода: private void butFormatStr_Click(object sender, EventArgs e { string AutoName; AutoName =...

Реализация интерфейса IEqualityComparer для HashSet<Dictionary<string, string>>
Код выдает &quot;2&quot;, что, логично, а хотелось бы, чтобы выдавал &quot;1&quot;, так как содержание словарей одинаковое. Подскажите, пожалуйста,...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru