Чтение базы данных MNIST в Java очень медленно - PullRequest
0 голосов
/ 02 марта 2019

Раньше я делал 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;
}

Любая помощь в том, почему это так медленно, поможет мне.Я использовал чужой пример, в котором он использовал байтовые буферы, и он работал быстро (около секунды).

1 Ответ

0 голосов
/ 02 марта 2019

Вы определенно хотите использовать BufferedInputStream следующим образом:

inputStream = new BufferedInputStream(new FileInputStream(imageFile));

Без буферизации каждого вызова inputStream.read() извлекает один байт из ОС.

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