Мне нужно прочитать символ файла размером 53 МБ. Когда я делаю это на С++ с помощью ifstream, это выполняется за миллисекунды, но с использованием Java InputStream это занимает несколько минут. Это нормально, что Java такая медленная, или я что-то упустил?
Также мне нужно доделать программу на Java (в ней используются сервлеты, из которых я должен вызывать функции, обрабатывающие эти символы). Я подумал, может быть, написать часть обработки файлов на C или C++, а затем использовать Java Native Interface для взаимодействия этих функций с моими Java-программами... Как вам эта идея?
Может ли кто-нибудь дать мне какой-либо другой совет... Мне серьезно нужно прочитать файл быстрее. Я пытался использовать буферизованный ввод, но он все равно не дает производительности даже близкой к C++.
Отредактировано: мой код состоит из нескольких файлов, и он очень грязный, поэтому я даю краткий обзор
import java.io.*;
public class tmp {
public static void main(String args[]) {
try{
InputStream file = new BufferedInputStream(new FileInputStream("1.2.fasta"));
char ch;
while(file.available()!=0) {
ch = (char)file.read();
/* Do processing */
}
System.out.println("DONE");
file.close();
}catch(Exception e){}
}
}
BufferedInputStream
? Вы должны использовать это поверхBufferedReader
. Ваши шаблоны доступа таковы, что вы можете отображать части файла в память, используяjava.nio
? В частности, когда вы говоритеchar
наchar
, достаточно ли вы знаете о кодировании, чтобы иметь дело сchar
, чьи последовательности байтов могут распространяться на несколько отображаемых в память сегментов? - person Mike Samuel   schedule 07.05.2012FileInputStream
. Но как только я добавляюBufferedInputStream
, производительность взлетает до 183 МБ за 10 секунд — 20 МБ/с. Обратите внимание, что вы не можете преобразовать байт в такой символ, за исключением случаев, когда вы читаете чистый поток ASCII. - person Marko Topolnik   schedule 07.05.2012read(byte[])
, используя массив из 1000 байт. Производительность составила 340 мс для 183 МБ, поэтому для вашего случая это будет около 100 мс. - person Marko Topolnik   schedule 07.05.2012BufferedInputStream
или ее отсутствие дает вам совсем немного по сравнению с вызовомread(int)
противread(byte[])
. - person Marko Topolnik   schedule 07.05.2012file.available()
неправильно. Попробуйте это,while((ch = (char)file.read()) >= 0)
и удалитеch = (char)file.read();
- person user845279   schedule 07.05.2012