java将文件排序_用Java进行大型文件的排序

这篇博客介绍了一种使用Java进行大文件排序的方法,通过快速排序算法,将大文件分成小块并存储在临时文件中,然后逐步排序并合并到最终结果文件。整个过程涉及到内存与磁盘的交互,以处理超出内存容量的大文件。
摘要由CSDN通过智能技术生成

这正是起源

QuickSort

当时内存中没有足够的RAM来排序,所以它们的过程是将部分结果存储在磁盘中。

所以你可以做的是:

选择一个轴。

按顺序读取文件,并将低于透视的数据存储在temp_file_1中,将大于或等于透视的数据存储在temp_file_2中。

重复temp_file_1中的过程,并将结果附加到result_文件中。

对temp_file_2重复该过程,并将结果附加到result_文件

当零件足够小时(

就像2个直接交换

足以在内存中进行排序)

这样,您就可以成批地进行排序,并将部分结果存储在临时文件中,最后一个文件将对结果进行排序。

编辑

我告诉过你一个快速排序是可能的。

毕竟,您需要一些额外的空间来存放临时文件。

我就是这么做的。

我创建了一个40MB的文件,文件中的数字用逗号分隔。

我给它命名

input

:

输入为40MB

排序过程中,将创建具有“大于”、“小于”值存储桶的tmp文件,排序完成后,这些值将被发送到一个名为(猜测是什么)的文件中。

output

使用部分结果创建临时文件

最后,删除所有tmp文件,结果保存在“输出”文件中,并按正确的编号顺序排序:

最后创建文件“output”,注意它也是40MB

这是完整的程序。

import java.io.*;

import java.util.*;

public class FileQuickSort {

static final int MAX_SIZE = 1024*1024*16; // 16 megabytes in this sample, the more memory your program has, less disk writing will be used.

public static void main( String [] args ) throws IOException {

fileQuickSort( new File("input"), new File("output"));

System.out.println();

}

//

static void fileQuickSort( File inputFile, File outputFile ) throws IOException {

Scanner scanner = new Scanner( new BufferedInputStream( new FileInputStream( inputFile ), MAX_SIZE));

scanner.useDelimiter(",");

if( inputFile.length() > MAX_SIZE && scanner.hasNextInt()) {

System.out.print("-");

// put them in two buckets...

File lowerFile = File.createTempFile("quicksort-","-lower.tmp",new File("."));

File greaterFile = File.createTempFile("quicksort-","-greater.tmp", new File("."));

PrintStream lower = createPrintStream(lowerFile);

PrintStream greater = createPrintStream(greaterFile);

PrintStream target = null;

int pivot = scanner.nextInt();

// Read the file and put the values greater than in a file

// and the values lower than in other

while( scanner.hasNextInt() ){

int current = scanner.nextInt();

if( current < pivot ){

target = lower;

} else {

target = greater;

}

target.printf("%d,",current);

}

// avoid dropping the pivot

greater.printf("%d,",pivot);

// close the stream before reading them again

scanner.close();

lower.close();

greater.close();

// sort each part

fileQuickSort( lowerFile , outputFile );

lowerFile.delete();

fileQuickSort( greaterFile , outputFile);

greaterFile.delete();

// And you're done.

} else {

// Else , if you have enough RAM to process it

//

System.out.print(".");

List smallFileIntegers = new ArrayList();

// Read it

while( scanner.hasNextInt() ){

smallFileIntegers.add( scanner.nextInt() );

}

scanner.close();

// Sort them in memory

Collections.sort( smallFileIntegers );

PrintStream out = createPrintStream( outputFile);

for( int i : smallFileIntegers ) {

out.printf("%d,",i);

}

out.close();

// And your're done

}

}

private static PrintStream createPrintStream( File file ) throws IOException {

boolean append = true;

return new PrintStream( new BufferedOutputStream( new FileOutputStream( file, append )));

}

}

文件的格式为

number,number,number,number

您当前的格式是:

n u m b e r , n u m b , b e r

要解决这个问题,你只需要把所有的内容都读一遍,然后跳过空白。

再加一个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值