Каков лучший способ подстроки большого текста? - PullRequest
0 голосов
/ 17 января 2019

Предположим, мой файл имеет размер 2 ГБ, я хочу получить определенные данные из одного. индекс для другого индекса (учитывая конкретные данные 300 МБ между двумя индексами), что является лучшим способом сделать это ?? Я пробовал подстроку, но выбрасывал исключение памяти. Пожалуйста, предложите лучший способ сделать то же самое.

Ответы [ 2 ]

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

Чтение файла за символом и запись его в выходной файл может решить проблему. Поскольку он не загружает весь файл сразу.

Итак, процесс будет - читать входной файл за символом, продолжать до нужного начального индекса подстроки, затем начинать запись в выходной файл до конца подстроки.

Если вы получаете Exception in thread "main" java.lang.OutOfMemoryError: Java heap space, вы можете попробовать увеличить размер кучи, если вам действительно нужно прочитать файл сразу, и вы уверены, что размер строки не превысит ограничение максимального размера строки.

Следующий фрагмент демонстрирует идею выше -

import java.io.*;

public class LargeFileSubstr {

    public static void main(String[] args) throws IOException {
        BufferedReader r = new BufferedReader(new FileReader("/Users/me/Downloads/big.txt"));

        try (PrintWriter wr = new PrintWriter(new FileWriter("/Users/me/Downloads/big_substr.txt"))) {
            int startIndex = 100;
            int endIndex = 200;
            int pointer = 0;
            int ch;

            while ((ch = r.read()) != -1) {

                if (pointer > endIndex) {
                    break;
                }

                if (pointer >= startIndex) {
                    wr.print((char) ch);
                }

                pointer++;

            }
        }

    }
}

Я пытался извлечь 200 МБ подстроки из файла 2 ГБ, работает довольно быстро.

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

В общем, если предположить, что файл объемом 2 ГБ находится на диске, и вы хотите прочитать какую-то часть из него в память, вам абсолютно не нужно сначала читать все 2 ГБ в память.

Наиболее простым решением является использование файла произвольного доступа

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

RandomAccessFile file = new RandomAccessFile(path, "r");
file.seek(position);
byte[] bytes = new byte[size];
file.read(bytes);
file.close();
...