Първо, ще ви трябва много памет за това. Няколко GB RAM, без GC стая.
Ако четете „единичен ред“ от 600 милиона цифри, в крайна сметка, след като редът е действително прочетен (вероятно дори няма да стигнете дотук), низът от 600 милиона цифри ще изисква 1,2 GB памет, просто за героите.
Java съхранява низовете като масиви от символи, а символите се съхраняват вътрешно като UTF-16, което е 2 байта.
Само това изпраща изискванията за памет през покрива.
Когато правите своето разделяне, вие превръщате всяка цифра в отделен низ. Вече имате 600M струни и всичко свързано с това. Като минимум търсите поне 16 байта на низ, тъй като той съхранява указателя към основния масив, отместване в масива и дължината на низа. За щастие, разделянето всъщност ще използва повторно основния масив, но това наистина не е от голяма полза тук.
16 байта * 600M е 9,6GB.
Определено сега се насочваме към "нелепата" сфера на изискванията за памет.
Не казвате какво всъщност искате да направите. Искате да "заредите файла", но не казвате в какво. Така че е трудно да се даде препоръка как трябва да се направи. Ако искате просто да отпечатате файла, тогава можете просто да прочетете всеки знак един по един и да го отпечатате, но това очевидно не е целта.
Така че, докато, да, можете да "хвърлите памет" върху този проблем, не искате. Трябва да проучите проблема и да излезете с по-добро представяне на това, което се опитвате да постигнете, и да работите от там.
person
Will Hartung
schedule
17.04.2014