- 1
- 2
https://habr.com/ru/post/449368/
Ко-ко-ко-ко-ко-кой багор )))
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
0
https://habr.com/ru/post/449368/
Ко-ко-ко-ко-ко-кой багор )))
Он будет как С++ только очень хуевый
>Он будет как С++ только очень хуевый
Я ещё джва года назад это ванговал.
- А я и нProgram halted due to out of memory exception
если бы строки в языке без гц выстраивали бы такие леса зависимостей то была бы жопа
Чем бы дитя не тешилось, лишь бы графы зависимостей не зацикливало. А с лисами и счётчик ссылок вполне справится.
ну а что делть? вот есть у тебя строка на гигабайт и я 20 раз взял у нее подстроку на 100 мегабайт
копировть 100 строк? так память кончица
не копировать? тогда как загарбиить большую строку?
всюду жопа!
а в стате много воды и петросянства ненужново совершенно
Да и хуй с ней, если честно. По крайней мере копирование предсказуемо - если я выбираю из гигабайтной строки стометровые куски, я ожидаю что это будет жрать дохуя памяти.
Мне больше нравится схема с явными string (новая строка) и string_ref (ссылка на кусок существующей строки). И лишних копирований нету и бесполезное говно в памяти не копится.
Но тогда придется всегда думать
Сишник и крестовик привыкли думать про память. Каждый раз делая что-то они понимают что вот тут память выделяется и заполняется, а тут у нас просто референс
А джаверы и джаваскриптеры о таких вещах не думают, потому пришлось сделать для них такое вот упращение
А ref версию всегда можно навернуть поверх обычной. Для тех, кому это реально надо.
Так все в яве и наслаждались O(1), а при необходимости явно писали new String (новая строка).
Пока светлые умы не решили починить обезьянам «утечки».
Это ещё в 7й или 8й версии "починили". Теперь trim работает не за няшные O(1), а за O(N).
А что делать?
В случае 100-мегабайтных строк несложно написать свою реализацию CharSequence c ожидаемым поведением.
>а в стате много воды и петросянства ненужново совершенно
habr.com — дальше не читал.
Абстракция протекла. Нам врали, что в джава можно не думать про память и строки. А оказалось нужно думать.
И только сраные сшинки, которые привыкли думать ВСЕГДА, посмеиваются себе в усы
Вот, те же проблемы в языках с прямым управлением памятью:
http://govnokod.ru/14458#comment214519
Потому кстати у крестухов аллергия от одного слова КУЧА.
На стеке, всё на стеке, лишь бы malloc не тупил и не отдавал null.
Ошибка уже здесь.
Строки из-за своего внутреннего устройства чисто алгоритмически не годятся для мутации гигантских объёмов данных. Там же везде O(N) и копирование вылазит. Например та же конкатенация.
В конечном итоге мы придём к старым-добрым лоу-левел технологиям постраничной адресации в 4k/2Mb. И обёртке в виде CharSequence & Appendable.
Выделяем память chunkами размером в страницу и наслаждаемся O(1) substring, append и малой перепитушнёй размером не больше двух страниц.
Я считал файл на гигабайт и взял из него несколько байт сабстрингом, положил и в List и потек.
Конечно, если делать серьезный хайлоад то надо думать о строках и рассматривать их как массив charов, но если это тупая тула то никто так не думает
Ведь сперва нужно выделить под массив цельный кусок памяти в гигабайт.
А это не так просто как кажется.
Например, у меня на машине свободно 5-6Gb, а свободного нефрагментированого гигабайта нет.
Я согласен с тем, что по хорошему надо читать такую штуку кусочками. Но что делать если вчера у тебя было 10 мегабайт, а сегодня вдруг стал гигабайт? Все перпесать>?
Потому сишкобляди/крестушки и используют всякие кастомные аллокаторы вроде jemalloc. Не от хорошей жизни это.
>значит тебя ждет свап
Не совсем. jvm всё-таки держит свободоное место дефрагментированным.
Хотя я конечно могу написать код который читает байты и реаллочит память и кладет их туда и наступить на те же грабли
Про jvm не понял. Джава же резирвирует память для кучи, а не коммитит её.
А фрагментированные объекты, пережившие сборку, копирует в другое место, уже без фрагментации.
*В новых сборщиках оно устроено несколько иначе. Но эти сборщики заточены под 10/100 гигабайтные кучи
Да все знали про это.
Ещё помню очень давно на ГК был пост в стиле
На что было указано, что не факт что это говно. Если s=bigString.substring(...)
Т.к. он выполняет копирование, выделяя новую память.
Когда люди делали такой конструктор, они ведь что-то соображали.
А они там не пробовали сделать просто new String(pituh)?
IRC есть?
Почтовая рассылка есть?
We are sorry for the inconvenience and ask for your patience. We should be back online soon!
Можно получать дайжест дискуссий на микропленке по почте?
Пошлите гонца.
нахуй она мне нужна?
https://pbs.twimg.com/media/CfsSp1KUMAEg6PP.jpg
Нужно откровение от самого Бога.
Там было что-то короткое new String(str)
Типа такого: http://govnokod.ru/17878#comment269223