Java 更改内存限制为20mb的大文件

Java 更改内存限制为20mb的大文件,java,memory,io,nio,large-files,Java,Memory,Io,Nio,Large Files,我想删除大txt文件中的重复编号,其中第一行是行中已排序的编号,但内存限制为20 mb。我读了这篇文章,并尝试使用BufferedWriter,但这个过程需要超过20MB。 请帮帮我 import java.io.*; import java.util.Scanner; public class DeleteRepeatingNumbers { public static void main(String[] args) throws IOException {

我想删除大txt文件中的重复编号,其中第一行是行中已排序的编号,但内存限制为20 mb。我读了这篇文章,并尝试使用BufferedWriter,但这个过程需要超过20MB。 请帮帮我

    import java.io.*;
import java.util.Scanner;

public class DeleteRepeatingNumbers {

    public static void main(String[] args) throws IOException {
        try (Scanner sc = new Scanner(
                new FileInputStream("input.txt"), "UTF-8");
             Writer writer = new BufferedWriter(
                     new OutputStreamWriter(
                             new FileOutputStream("output.txt"), "utf-8"))) {
            int n = sc.nextInt();
            int prevInt = 0;

            if (n != 0) {
                prevInt = sc.nextInt();
                writer.write(String.valueOf(prevInt));
            }
            for (int i = 0; i < n - 1; i++) {
                int next = sc.nextInt();
                if (next != prevInt) {
                    writer.write(System.getProperty("line.separator"));
                    writer.write(String.valueOf(next));
                    prevInt = next;
                }
            }
        }
    }
}

我不确定20mb是否足以启动JVM,但从程序的角度来看,我们可以通过以下方式减少内存占用

这个问题有两种解决方案:

  • 你需要知道数字,这样你就可以检查重复性。 逐行读取文件,并将数字输入HashMap。如果hashmap.containsKey返回true,则可以假定它已被复制。 这样做的好处是一次迭代就足以解决用例,但如果数字非常独特,则可能会突破20MB内存限制。
  • 您可以从文件中读取第一个数字,然后逐行再次遍历文件中的所有行,并删除重复出现的行。然后从文件中读取下一条记录并再次迭代。 好位:20mb内存限制不成问题,缺点是迭代次数会增加,这将等于唯一数字的数量。

  • 希望这有帮助。

    我不确定20mb是否足以启动JVM,但从程序的角度来看,我们可以通过以下方式减少内存占用

    这个问题有两种解决方案:

  • 你需要知道数字,这样你就可以检查重复性。 逐行读取文件,并将数字输入HashMap。如果hashmap.containsKey返回true,则可以假定它已被复制。 这样做的好处是一次迭代就足以解决用例,但如果数字非常独特,则可能会突破20MB内存限制。
  • 您可以从文件中读取第一个数字,然后逐行再次遍历文件中的所有行,并删除重复出现的行。然后从文件中读取下一条记录并再次迭代。 好位:20mb内存限制不成问题,缺点是迭代次数会增加,这将等于唯一数字的数量。

  • 希望这有帮助。

    如果您能向我展示您的资源,我可以更有效地帮助您。但我想你可以先试试这个

    公共类删除重复编号{
    公共静态void deleteRepeatingNumber(){
    StringBuilder sb=新的StringBuilder();
    try(Scanner sc=new Scanner(新文件输入流(“resources\\RepeatingNumberTest.txt”),“UTF-8”)){
    Set dontRepeatedNumbers=new HashSet();
    while(sc.hasNext()){
    DontRepeatedNumber.add(sc.nextInt());
    }
    dontRepeatedNumbers.stream().forEach((整数)->{
    sb.append(String.valueOf(number));
    sb.append(System.getProperty(“line.separator”);
    });
    }捕获(IOE异常){
    系统输出打印ln(e);
    }
    try(Writer Writer=new BufferedWriter(new OutputStreamWriter(new FileOutputStream)(“resources\\RepeatingNumberTest\u Output.txt”),“utf-8”)){
    写(某人写的东西);
    }捕获(IOE异常){
    系统输出打印ln(e);
    }
    }
    
    }
    如果您能向我展示您的资源,我可以更有效地帮助您。但我想你可以先试试这个

    公共类删除重复编号{
    公共静态void deleteRepeatingNumber(){
    StringBuilder sb=新的StringBuilder();
    try(Scanner sc=new Scanner(新文件输入流(“resources\\RepeatingNumberTest.txt”),“UTF-8”)){
    Set dontRepeatedNumbers=new HashSet();
    while(sc.hasNext()){
    DontRepeatedNumber.add(sc.nextInt());
    }
    dontRepeatedNumbers.stream().forEach((整数)->{
    sb.append(String.valueOf(number));
    sb.append(System.getProperty(“line.separator”);
    });
    }捕获(IOE异常){
    系统输出打印ln(e);
    }
    try(Writer Writer=new BufferedWriter(new OutputStreamWriter(new FileOutputStream)(“resources\\RepeatingNumberTest\u Output.txt”),“utf-8”)){
    写(某人写的东西);
    }捕获(IOE异常){
    系统输出打印ln(e);
    }
    }
    

    }
    20mb用于整个jvm?这将是困难的。如何启动jvm,会发生哪种错误?它仅用于缓冲区,在哪里使用的内存超过20mb?我不明白你的问题你在哪里看到超过20mb的数据被使用?我不明白你的问题是整个jvm的20MB?这将是困难的。如何启动jvm,会发生哪种错误?它仅用于缓冲区,在哪里使用的内存超过20mb?我不明白你的问题你在哪里看到超过20mb的数据被使用?我不明白你的问题。谢谢你花时间。我添加了删除if(sc.hasNext())sc.nextInt()的第一行,并没有在第一行中添加分隔符:Iterator iter=dontRepeatedNumbers.Iterator();如果(iter.hasNext()){sb.append(iter.next());iter.remove();}但这也需要超过20MB。而且我忘了写第一行是排序数。例如:21 2 4 8 8 9 11 11 11 11 13 14 15 16 222 222 222 222 222 222 222在我看来,您可以通过将缓冲区分成两部分来减少缓冲区大小。首先,您读取文件,执行逻辑,并将结果放入一个字符串生成器。然后将字符串生成器中的所有数据写入输出文件。我认为这将减少大量的缓冲区大小。但是关于限制(20MB),这取决于您的输入。谢谢您花时间。我添加了删除if(sc.hasNext())sc.nextInt()的第一行,并没有在第一行中添加分隔符:Iterator iter=dontRepeatedNumbers.Iterator();如果(iter.hasNext()){sb.append(iter.next());iter.remove();}但这也需要超过20MB。而且我忘了写第一行是排序数。例如:21248889111111111131415162222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
    21
    2
    4
    8
    8
    8
    9
    11
    11
    11
    11
    11
    11
    13
    14
    15
    16
    222
    222
    222
    222
    222