Я пытаюсь прочитать 512 МБ-файл в java-памяти. Вот мой код:Производительность при чтении данных в память java
String url_part = "/homes/t1.csv";
File f = new File(url_part);
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f)));
ArrayList<String> mem = new ArrayList<String>();
System.out.println("Start loading.....");
System.gc();
double start = System.currentTimeMillis();
String line = br.readLine();
int count = 0;
while(line!=null){
line=br.readLine();
mem.add(line);
//System.out.println(count);
count++;
if(count%500000==0){
System.out.println(count);
}
}
Файл содержит 40000000 линии, производительность совершенно нормально перед чтением 18500000 строк, но это заклинивание где-то после прочтения около 20000000 строк. (Он замораживается здесь, но продолжается после долгого ожидания, около 10 секунд)
Я отслеживал использование памяти, я нашел, что даже общий размер файла составляет всего 512 МБ, при работе программы память растет примерно на 2 ГБ. Кроме того, 8-ядерный процессор продолжает работать на 100% -ном уровне.
Я просто хочу прочитать файл в памяти, чтобы позже я смог получить доступ к данным, которые я хочу быстрее из памяти. Правильно ли я делаю? БЛАГОДАРЮ!
«Я нашел, что даже общий размер файла составляет всего 512 МБ, при работе программы память составляет около 2 ГБ» - это не огромный сюрприз. У вас есть a) накладные расходы на строковые объекты, массивы и т. Д. - если каждая строка содержит всего около 25 символов, это, возможно, значимо; б) предполагая, что файл закодирован в ASCII или какой-либо другой кодировке с 1 байтом на символ, у вас есть коэффициент два раздутия только из-за использования UTF-16 в Java. –
Это похоже на проблему [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). – biziclop
@JonSkeet Спасибо за ответ! Но ключ в том, почему программа застряла в какой-то момент? Он читал гладко раньше, но работает медленнее и медленнее. – fTTTTT