Рассмотрим класс со статическим фабричным методом, который получает строку CSV (или TSV) в качестве входных данных (имена переменных для удобства переименованы):
String[] fields=StringUtils.split(tsvLine, '\t');
return new MYObject(
Integer.parseInt(fields[0]),
StringUtils.strip(fields[1], "\"").intern(), // Many duplicates
StringUtils.strip(fields[2], "\""), // Unique
StringUtils.strip(fields[4], "\"").intern(), // Many duplicates
Double.parseDouble(fields[7]),
Double.parseDouble(fields[6]));
Этот метод анализирует около 5 миллионов записей из файла размером ~ 500 МБ. Чтобы сохранить память, я сохраняю три соединенные строки:
Я пробовал следующую оптимизацию:
public MyObject(int i1, String str0, String str1, String str2,
double d1, double d2)
{
...
this.tsvStrings = (str0+'\t'+str1+'\t'+str2).toCharArray();
...
}
(Разумеется, они разбиты на соответствующие методы получения и установки).
Размер процесса все еще значительно превышает 1 ГБ, хотя большая часть его содержимого игнорируется. Какой лучший способ оптимизировать это? Сохраняю ли я ненужные ссылки?
РЕДАКТИРОВАТЬ : str0 и str2 имеют дубликаты, str1 уникален.