Самый быстрый и эффективный способ извлечения, сортировки и управления данными из чрезвычайно большого текстового файла

У меня есть текстовый файл, в каждой строке которого есть текст, например:


1245 Собака Хаски

2356 Полосатый кот

3476 Собака Мопс


с огромным количеством произвольных данных, повторяющихся в строке, около 10 000 строк, ради аргумента, скажем, стремится к бесконечности.

У меня есть код, который считывает эти данные и сохраняет их в объекте, далее следует псевдокод;

Pet P; 
lineInput = reader.readLine();  //where reader is reading the above mentionedfile
P.id = lineInput.split('\t')[0]     
P.type = lineInput.split('\t')[1]   //Assigning the parts of the line to it's relevant data members 
P.breed = lineInput.split('\t')[2]  

Теперь вот проблема, учитывая, что мне нужно иметь возможность сортировать, искать и отображать эти значения как можно быстрее, я не знаю, что мне лучше всего, я придумал два метода, которые можно увидеть ниже.

Способ 1: сохранить все объекты в списке массивов на основе их начального идентификатора

ArrayList<Pet> idStartsWith1;
if(P.id starts with 1)
     idStartsWith1.add(P);    // "1245    Dog    Husky" will be added here

ArrayList<Pet> idStartsWith2;
if(P.id starts with 2)
     idStartsWith2.add(P);   // "2356    Cat    Tabby" will be added here

ArrayList<Pet> idStartsWith3;
if(P.id starts with 3)
     idStartsWith3.add(P);   // "3476    Dog    Pug" will be added here

Я думаю, что это будет более быстрый метод, так как эти массивы уже находятся в памяти процесса, но я боюсь, что это перегрузит память и вызовет проблемы. (Помните, количество строк в текстовом файле стремится к бесконечности)

Способ 2: Запишите все объекты в файл .dat на основе их начального идентификационного номера.

Writer writer1 = new Writer("idStartsWith1.dat");    //writer1 will write to file "idStartsWith1.dat"
if(P.id starts with 1)
     writer1.write(P);    // "1245    Dog    Husky" will be writen to this file 

Writer writer2 = new Writer("idStartsWith2.dat");    //writer2 will write to file "idStartsWith2.dat"
if(P.id starts with 2)
     writer2.write(P);

Writer writer3 = new Writer("idStartsWith3.dat");    //writer3 will write to file "idStartsWith3.dat"
if(P.id starts with 3)
     writer3.write(P);

Это предотвратит перегрузку памяти процесса, но я боюсь, что необходимость открывать, затем читать, а затем закрывать файл каждый раз, когда мне нужно найти и отобразить Pet, добавит значительные задержки во время выполнения.

Какой из этих двух методов будет работать лучше? или есть другой более эффективный метод, который не придет в голову такому новичку в Java, как я?


person EltoCode    schedule 02.03.2020    source источник
comment
вы говорите, что строки стремятся к бесконечности, но вы говорите о 10 000 строк... на большинстве устройств 10K, 100K, 1M, 10M таких строк, вы также можете считать память бесконечной... есть ли у вас какой-либо верхний предел числа линий?   -  person Matteo    schedule 02.03.2020
comment
Отвечает ли это на ваш вопрос? Сортировка файла с огромным объемом данных с заданной памятью ограничение   -  person GotoFinal    schedule 02.03.2020
comment
Вам нужна база данных.   -  person rustyx    schedule 03.03.2020
comment
@Matteo Я полагаю, что верхний предел будет около нескольких миллионов   -  person EltoCode    schedule 03.03.2020


Ответы (1)


Данные многих приложений достаточно малы, чтобы поместиться в основную память настольного компьютера. Когда ваш файл имеет размер 1 ГБ, вам нужно около 3 ГБ основной памяти, и это не проблема для большинства настольных компьютеров. В мобильной версии все иначе.

Ничто не может быть таким быстрым, как работа с основной памятью, если все сделано правильно. ArrayList нельзя использовать для поиска, а Map можно.

Вместо этого вы можете использовать базу данных, и вам, вероятно, следует. Это намного медленнее, чем иметь все данные в основной памяти, но все же очень быстро, если вы все сделаете правильно (узнаете об индексах и т. д.). Большинство баз данных могут импортировать CSV-файл напрямую и могут ответить на все ваши запросы — фильтрация, сортировка и объединение других таблиц — вот для чего существуют базы данных.

person maaartinus    schedule 03.03.2020