изменение большого файла с ограничением памяти 20 МБ - PullRequest
0 голосов
/ 30 января 2019

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

    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 голосов
/ 30 января 2019

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

public class DeleteRepeatingNumbers {

	public static void deleteRepeatingNumber() {
		StringBuilder sb = new StringBuilder();
		try (Scanner sc = new Scanner(new FileInputStream("resources\\RepeatingNumberTest.txt"), "UTF-8")) {
			Set<Integer> dontRepeatedNumbers = new HashSet<>();
			while (sc.hasNext()) {
				dontRepeatedNumbers.add(sc.nextInt());
			}
			dontRepeatedNumbers.stream().forEach((Integer number) -> {
				sb.append(String.valueOf(number));
				sb.append(System.getProperty("line.separator"));
			});
		} catch (IOException e){
			System.out.println(e);
		}
		
		try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("resources\\RepeatingNumberTest_Output.txt"), "utf-8"))) {
			writer.write(sb.toString());
		} catch (IOException e){
			System.out.println(e);
		}
	}
}

Надеюсь, это будет полезно.

0 голосов
/ 30 января 2019

Я не уверен, что 20 Мб будет достаточно для запуска JVM, но с точки зрения программы мы можем уменьшить объем памяти, используя эти способы.

Что ж, для этого могут быть два решенияпроблема:

  1. Вам нужно знать номера, чтобы вы могли проверить наличие дубликатов.Читайте файл построчно и вставляйте число в HashMap.Если hashmap.containsKey возвращает true, вы можете предположить, что оно было продублировано. Преимуществом этого является то, что одной итерации достаточно для решения варианта использования, но ограничение памяти в 20 МБ может быть нарушено, если числа уникальны.
  2. Вы можете прочитать первое число из файла изатем переберите все строки в файле снова построчно и удалите повторяющееся вхождение.А затем вы читаете следующую запись из файла и повторяете снова. Хороший бит: ограничение памяти в 20 Мб не будет проблемой, снизится число итераций, которое будет равно количеству уникальных чисел.

Надеюсь, это поможет.

...