Создание простого индекса для текстового файла в Java - PullRequest
1 голос
/ 22 ноября 2011

Мне нужно реализовать простую схему индексации для большого текстового файла.Текстовый файл содержит пары ключ-значение, и мне нужно прочитать определенную пару ключ-значение без загрузки всего файла в память.Текстовый файл огромен и содержит миллионы записей, а ключи не отсортированы.Различные пары ключ-значение должны быть прочитаны в зависимости от ввода пользователя.Поэтому я не хочу, чтобы весь файл читался каждый раз.Пожалуйста, дайте мне знать точные классы и методы в API обработки файлов Java, которые помогут реализовать это простым и эффективным способом. Я хочу сделать это без использования внешней библиотеки, такой как lucene.

Ответы [ 3 ]

5 голосов
/ 23 ноября 2011

Как отмечалось в комментариях, вам потребуется выполнить линейный поиск по всему файлу в худшем случае, а в среднем по половине.Но, к счастью, есть некоторые хитрости, которые вы можете сделать.

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

Если для этого нет места на диске, то создайте индексный файл, которыйимеет все ключи в исходном файле в качестве ключа и смещение в исходном файле в качестве значения.Снова используются записи фиксированной длины.Или лучше сделать этот индексный файл базой данных.Или загрузите оригинальный файл в базу данных.В любом случае, дисковое хранилище очень дешево.

РЕДАКТИРОВАТЬ: Чтобы создать индексный файл, откройте основной файл с помощью RandomAccessFile и последовательно прочитайте его.Используйте метод getFilePointer () в начале каждой записи, чтобы прочитать позицию в файле и сохранить ее плюс ключ в индексном файле.При поиске чего-либо прочитайте указатель файла из индексного файла и используйте метод seek (long), чтобы перейти к точке в исходном файле.

2 голосов
/ 23 ноября 2011

Я бы рекомендовал создать индексный файл.Сканируйте входной файл и запишите каждый ключ и его смещение в List, затем отсортируйте список и запишите его в индексный файл.Затем, когда вы захотите найти ключ, вы читаете в индексном файле и делаете двоичный поиск в списке.Как только вы найдете нужный вам ключ, откройте файл данных как RandomAccessFile и найдите положение ключа.Затем вы можете прочитать ключ и значение.

0 голосов
/ 22 ноября 2011

Как насчет использования Java-сканера.

http://docs.oracle.com/javase/tutorial/essential/io/scanning.html

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

public class ScanXan {
    public static void main(String[] args) throws IOException {
        Scanner s = null;
        try {
            s = new Scanner(new BufferedReader(new FileReader("xanadu.txt")));

            while (s.hasNext()) {
                // **split the string and match it for your key here** 
                System.out.println(s.next());
            }
        } finally {
            if (s != null) {
                s.close();
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...