>>3594447 Ну главное чтобы завелось. В общем, ты еще должен держать в уме такую вещь, как непрерывности данных. У тебя в памяти неизбежно происходит фрагментация данных: какие-то данные удаляются, какие-то остаются. GC периодически занимается дефрагментацией, стек чистится часто, куча реже (SOH), а еще есть куча с большими данными (LOH), она вообще не дефрагментируется, только если это не критическая ситуация.
Так вот string даже если технически может хранить 2Гб, это иммутабельный массив, которому нужна непрерывность. Именно поэтому при каждой операции со строками создается новая строка. Опустим момент с операциями над хуйней размером в 1Гб, к которой ты предположительно решил добавить символ, от чего создастся еще одна копия размером 1Гб но с этим символом в составе. Предположим, что мы эту ебалу вообще не трогаем и не дышим на нее, мы хотим просто создать стриг в памяти, т.е. для твоей задачи нужно выделить беспрерывный участок памяти в 1Гб, из-за фрагментации данных такой финт провернуть мягко говоря трудновато, даже если формально оперативы больше. Как минимум это будет нестабильно. А угадай в какой куче будут храниться твои гигабайты: в SOH или LOH? Прааально, в LOH — там где дефрагментация отсутствует.
А вот со стринг билдером ситуация другая. Хз почему он уперся рогами, потому что это связанный список и он способен фрагментировать данные и хранить их по разным углам памяти. Может быть ты сам заюзал sb.ToString() чем спровоцировал формирование string, для которого не нашлось места в памяти.
>>3594651 А еще в loh чанки размером в 80мб или около того, что вынуждает во избежание написания велосипедов юзать лох-ориентед либы для работы с огромными блобами.