Поиск выражения в очень длинной строке в Java - PullRequest
0 голосов
/ 14 декабря 2011

Моя строка, содержащая текстовый файл размером 50 МБ. Я получил свою строку так:

RandomAccessFile file = new RandomAccessFile("wiki.txt", "r");
FileChannel channel = file.getChannel();
MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, 1024*50);
byte[] b = new byte[1024*50];
buffer.get(b);
String wiki = new String(b);

Я получаю строковое выражение, которое может содержать несколько слов, и мне нужно вернуть ответ, если это выражение есть в моей вики-строке (большая строка) или нет. Действие работает хорошо для примерно 1% строки (от начала строки), и когда искомая фраза находится в середине или конце строки, ответ, который я получаю для следующего кода, является ложным :

System.out.println(wiki.contains(strToCheck));
System.out.println(wiki.indexOf(strToCheck, 0));
System.out.println(wiki.matches("(?i).*"+strToCheck+".*"));

Кто-нибудь знает, почему это происходит? Или что я делаю не так?

Спасибо.

Ответы [ 4 ]

5 голосов
/ 14 декабря 2011

Мне жаль это говорить, но 1024 * 50, а не 50M. Это 50K. Кажется, что вы читаете 0,1% своего файла, а затем ищете его.

1 голос
/ 14 декабря 2011

вы должны попробовать

MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, 1024*1024*50);

потому что 50 MB = 1024*1024*50, 50kb = 1024 * 50, 1MB = 1024 кб`

0 голосов
/ 14 декабря 2011

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

0 голосов
/ 14 декабря 2011

Бритва Оккама: strToCheck НЕ в wiki.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...