Я пытаюсь загрузить CSV-файл с огромным количеством строк (> 5 миллионов), но он сильно замедляется при попытке обработать их все в массив данных каждого значения
Я пробовал несколько разных вариантов чтения и удаления из списка ввода, который я загрузил из файла, но он все равно заканчивается исчерпанием пространства кучи, даже когда я выделяю 14 ГБ процессу, в то время как файл занимает всего 2 ГБ.
Я знаю, что мне нужно удалять значения, чтобы в памяти не возникало повторяющихся ссылок, чтобы я не заканчивал массив строк, а также массив отдельных значений, разделенных запятыми, но я понятия не имею как сделать что-то подобное
Редактировать: для справки, в данной конкретной ситуации данные должны содержать 16 * 5 миллионов значений.
Если есть более элегантное решение, я за него
Цель при загрузке этого файла - обработать его как базу данных, используя соответствующие методы, такие как select и select where, все они обрабатываются классом листа. Он отлично работал с моим меньшим образцом файла из 36k строк, но я думаю, он не очень хорошо масштабируется
Текущий код:
//Load method to load it from file
private static CSV loadCSV(String filename, boolean absolute)
{
String fullname = "";
if (!absolute)
{
fullname = baseDirectory + filename;
if (!Load.exists(fullname,false))
return null;
}
else if (absolute)
{
fullname = filename;
if (!Load.exists(fullname,false))
return null;
}
ArrayList<String> output = new ArrayList<String>();
AtomicInteger atomicInteger = new AtomicInteger(0);
try (Stream<String> stream = Files.lines(Paths.get(fullname)))
{
stream.forEach(t -> {
output.add(t);
atomicInteger.getAndIncrement();
if (atomicInteger.get() % 10000 == 0)
{
Log.log("Lines done " + output.size());
}
});
CSV c = new CSV(output);
return c;
}
catch (IOException e)
{
Log.log("Error reading file " + fullname,3,"FileIO");
e.printStackTrace();
}
return null;
}
//Process method inside CSV class
public CSV(List<String> output)
{
Log.log("Inside csv " + output.size());
ListIterator<String> iterator = output.listIterator();
while (iterator.hasNext())
{
ArrayList<String> d = new ArrayList<String>(Arrays.asList(iterator.next().split(splitter,-1)));
data.add(d);
iterator.remove();
}
}