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

时间:2019-01-30 05:32:01

标签: java memory io nio large-files

我想从大txt文件中删除重复数字,其中第一行是该行中已排序数字的数量,但内存限制为20 mb。我阅读了文章How to Read a Large File,并尝试使用BufferedWriter,但是该过程需要20 mb以上的内存。 请帮助我。

    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;
                }
            }
        }
    }
}

示例:

21
2
4
8
8
8
9
11
11
11
11
11
11
13
14
15
16
222
222
222
222
222

2 个答案:

答案 0 :(得分:1)

我不确定20mb是否足以启动JVM,但是从程序角度来看,我们可以使用这些方法来减少内存占用。

这个问题可以有两种解决方法:

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

希望这会有所帮助。

答案 1 :(得分:1)

如果您能向我展示您的资源,我会更有效地帮助您。但是我认为您可以先尝试一下。

ChartYAxis *leftAxis = _chartView_fairway_hit.leftAxis;
leftAxis.labelFont = [UIFont systemFontOfSize:10.f];
leftAxis.labelCount = 5;
//    leftAxis.valueFormatter = [[ChartDefaultAxisValueFormatter alloc] initWithFormatter:leftAxisFormatter];
leftAxis.labelPosition = YAxisLabelPositionOutsideChart;
leftAxis.spaceTop = 0.25;
leftAxis.axisMinimum = 0;
leftAxis.axisMaximum = 100;

我希望这会有用。