Во-первых, вам понадобится много памяти для этого. Несколько ГБ оперативной памяти, не считая комнаты GC.
Если вы читаете «одну строку» из 600 миллионов цифр, в конце концов, после того, как строка будет фактически прочитана (вы, вероятно, даже не доберетесь до этого места), строка из 600 миллионов цифр потребует 1,2 ГБ памяти, просто для персонажи.
Java хранит строки как массивы символов, а символы хранятся внутри как UTF-16, что составляет 2 байта.
Это само по себе отправляет требования к памяти через крышу.
Когда вы выполняете разделение, вы превращаете каждую цифру в отдельную строку. Теперь у вас есть 600 миллионов строк и все связанные с этим накладные расходы. Как минимум, вы просматриваете не менее 16 байтов на строку, поскольку в ней хранится указатель на базовый массив, смещение в массиве и длина строки. К счастью, split на самом деле повторно использует базовый массив, но здесь это не очень помогает.
16 байт * 600M — это 9,6 ГБ.
Теперь мы определенно переходим к «смехотворной» сфере требований к памяти.
Вы не говорите, что вы на самом деле хотите сделать. Вы хотите "загрузить файл", но не говорите в какой. Таким образом, трудно дать рекомендацию о том, как это должно быть сделано. Если вы хотите просто распечатать файл, вы можете просто прочитать каждый символ один за другим и распечатать его, но это явно не цель.
Так что пока, да, можно "кинуть память" на эту проблему, не хочется. Вам нужно изучить проблему и придумать лучшее представление о том, чего вы пытаетесь достичь, и работать исходя из этого.
person
Will Hartung
schedule
17.04.2014