Раньше я делал MNIST-ридер на c ++, который был действительно быстрым, теперь я пытался воссоздать его на Java, но чтение меток и изображений из набора данных занимает около 10 секунд, что слишком долго.Я не знаю много о Java IO, и поэтому я не знаю, что я делаю, что делает его таким медленным.
Вот мой код
public static double[][] loadImages(File imageFile) {
try {
inputStream = new FileInputStream(imageFile);
//Skip Magic number
inputStream.skip(4);
//Read Image Number
int imageNum = nextNByte(4);
//Get Image dimensions
int rows = nextNByte(4);
int cols = nextNByte(4);
//Initialize the image array
double[][] images = new double[imageNum][rows*cols];
//Place the input
for(int i = 0; i<imageNum;i++){
for(int k = 0; k<cols*rows;k++){
images[i][k]= nextNByte(1);
}
}
//Close Input Stream
inputStream.close();
//Verbose Output
System.out.println("Images Loaded!");
return images;
} catch (IOException e) {
e.getCause();
}
//Verbose Output
System.out.println("Couldn't Load Images!");
return null;
}
Это мои изображенияфайл и метки один использует тот же метод, поэтому я не буду поднимать его.Вот полезная функция, которую я сделал для этого, которая читает N байтов и возвращает ее в целых числах.
private static int nextNByte(int n) throws IOException {
int k=inputStream.read()<<((n-1)*8);
for(int i =n-2;i>=0;i--){
k+=inputStream.read()<<(i*8);
}
return k;
}
Любая помощь в том, почему это так медленно, поможет мне.Я использовал чужой пример, в котором он использовал байтовые буферы, и он работал быстро (около секунды).