从极大的文本文件中检索,排序和处理数据的最快,最有效的方法

问题描述 投票:0回答:1

我有一个文本文件,每行上都有文本,例如:


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:根据所有对象的起始ID号将它们存储在数组列表中

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:根据所有对象的起始ID号将它们写入.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新手不会发生的另一种更有效的方法?

java performance memory file-read
1个回答
0
投票
许多应用程序的数据足够小,可以放入计算出的桌面的主内存中。当文件具有1 GB时,则需要约3 GB的主内存,对于大多数台式机来说这没问题。在移动设备上,情况有所不同。

正确完成后,没有什么比使用主存储器快了。 ArrayList不可用于搜索,但Map可用。

您可以改用数据库,您可能应该使用。这比将所有数据都存储在主内存中要慢得多,但是假设您做得正确(了解索引等),它仍然非常快。大多数数据库可以直接导入CSV文件,并且能够回答所有查询-数据库存在的目的是过滤,排序和联接其他表。

© www.soinside.com 2019 - 2024. All rights reserved.