Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сравнение скорости работы с дисковыми файлами 
V
    Опции темы
Mirkes
Дата 14.4.2014, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 7
Всего: 17



Как я писал некоторое время назад, я столкнулся с непонятным мне крайне медленным дисковым обменом при работе с файлами прямого (произвольного) доступа.
Сейчас у меня появилось немного времени и я решил проверить какова скорость работы с дисками нескольких типов файлового доступа. Очевидно, что тест не универсален, а ориентирован скорее на мою исходную задачу.
Имеется большой файл (порядка 100 миллионов значений) содержащий описание некоего спутникового снимка. Файл слишком велик, что бы постоянно держать его в памяти, а таких файлов несколько (в моем случае 11). С другой стороны, постоянное наличие файла в памяти не является необходимым. По отношению к файлу имеется несколько типов запросов:
1.    Необходимо прочитать весь файл, что бы произвести отрисовку. Все читается последовательно.
2.    По запросам (порядка 20 тысяч) извлечь из файла значение, соответсвующее определенным координатам. К сожалению запросы поступают в произвольном порядке и их упорядочение по строкам в файле невозможно.
Изначально формат файла текстовый. Для данного теств я в 100 раз уменьшил размеры для ускорения тестов. Перенос файлов на другой компьютер не предполагался.
Итак имеется текстовый файл «Source.txt» с заголовком
ncol = 1000
nrow = 1000
За которым следует 1000 строк в которых указано по 1000 значений типа double. Исходно у меня была идея, что после преобразования файла в бинарный вид чтение и запись будут быстрее. Посему я преобразовал исходный файл в бинарный с записью заголовка в начале в виде двух чисел типа double.
Проведенный тест.
Я сгенерировал массив из 1 000 000 действительных чисел. После чего произвел запись на диск этого массива несколькими видами файлового доступа, засекая время.
Произвел тест скорости последовательного чтения этих файлов.
Сгенерировал массив из 20 000 пар срока-столбец полученных генератором случайных чисел (для воспроизводимости результатов) и провел тест скорости получения данных при чтении в случайном порядке.
Тестировались следующие виды файлов (доступа)
1.    Текстовые файлы – BufferedWriter(FileWriter), BufferedReader(FileReader).
2.    Бинарные файлы
2.1.    Простейшие бинарные файлы FileOutputStream, FileInputStream
2.2.    Бинарные файлы с интерфейсом DataInput, DataOutput: DataOutputStream(FileOutputStream), DataInputStream(FileInputStream).
2.3.    Бинарные файлы прямого доступа с использованием интерфейса DataInput, DataOutput.
2.4.    Бинарные файлы прямого доступа без использованиея интерфейса DataInput, DataOutput
2.5.    То же что 2.3 но с отображением файла в память.
Таким образом получилось 6 вариантов файлов. 
Текст теста приведен ниже.
Код

package files;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.RandomAccessFile;

import java.nio.ByteBuffer;
import java.nio.DoubleBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

import java.util.Random;
import java.util.StringTokenizer;


public class FileAccessTimeTest {
    private final int rows = 1000, cols = 1000, reads = 20000;
    private double[][] data = new double[rows][cols];
    private int ccol = 0, rrow = 0;
    private byte[] bytes = new byte[8];
    private ByteBuffer bb = ByteBuffer.wrap(bytes);
    private double[][] control = new double[rows][cols];
    private int coords[][] = new int[reads][2];
    private double[] contr = new double[reads];
    private final String dir = "C:\\LocalData\\em322\\Apps\\Tests\\Files\\TestFile\\";
    private static final int BYTE_IN_DBL = Double.SIZE / Byte.SIZE;

    public static void main(String[] args) {
        new FileAccessTimeTest();
    }

    public FileAccessTimeTest() {
        //Data generation
        generateData();
        bb.mark();
        try {
            //Consequent write test
            textWrite(dir);
            simpleBinaryWrite(dir);
            dataInOutWrite(dir);
            rafSimpleWrite(dir);
            rafInOutWrite(dir);
            rafMapSimpleWrite(dir);
            //Consequent read test
            textRead(dir);
            simpleBinaryRead(dir);
            dataInOutRead(dir);
            rafSimpleRead(dir);
            rafInOutRead(dir);
            rafMapSimpleRead(dir);
            //Random order read test
            textReadRO(dir);
            simpleBinaryReadRO(dir);
            dataInOutReadRO(dir);
            rafSimpleReadRO(dir);
            rafInOutReadRO(dir);
            rafMapSimpleReadRO(dir);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private final void generateData() {
        Random rnd = new Random();
        //Generate data to input/output
        for (int row = 0; row < rows; row++)
            for (int col = 0; col < cols; col++)
                data[row][col] = rnd.nextDouble() * 1000;
        //Generate coordinates to random read test
        for (int r = 0; r < reads; r++) {
            coords[r][0] = rnd.nextInt(rows);
            coords[r][1] = rnd.nextInt(cols);
        }
    }

    public byte[] toByteArray(double value) {
        bb.reset();
        bb.putDouble(value);
        return bytes;
    }

    public double fromByteArray() {
        bb.reset();
        return bb.getDouble();
    }

    private final void textWrite(final String dir) throws IOException {
        System.out.print("Consequent write text ");
        long t0 = System.nanoTime();
        BufferedWriter bw = new BufferedWriter(new FileWriter(dir + "Text.txt"));
        //Write header
        bw.write("ncols " + cols);
        bw.newLine();
        bw.write("nrows " + rows);
        bw.newLine();
        //Write data
        for (int row = 0; row < rows; row++) {
            for (int col = 0; col < cols; col++)
                bw.write(data[row][col] + " ");
            bw.newLine();
        }
        bw.close();
        long t1 = System.nanoTime();
        System.out.println("\t" + (t1 - t0));
    }

    private final void simpleBinaryWrite(final String dir) throws IOException {
        System.out.print("Consequent write simple ");
        long t0 = System.nanoTime();
        FileOutputStream fos = new FileOutputStream(dir + "simple.bin");
        double d;
        //Write header
        d = cols;
        fos.write(toByteArray(d));
        d = rows;
        fos.write(toByteArray(d));
        //Write data
        for (int row = 0; row < rows; row++)
            for (int col = 0; col < cols; col++)
                fos.write(toByteArray(data[row][col]));
        fos.close();
        long t1 = System.nanoTime();
        System.out.println("\t" + (t1 - t0));
    }

    private final void dataInOutWrite(final String dir) throws IOException {
        System.out.print("Consequent write DataOutput ");
        long t0 = System.nanoTime();
        DataOutputStream dos = new DataOutputStream(new FileOutputStream(dir + "data.bin"));
        double d;
        //Write header
        d = cols;
        dos.writeDouble(d);
        d = rows;
        dos.writeDouble(d);
        //Write data
        for (int row = 0; row < rows; row++)
            for (int col = 0; col < cols; col++)
                dos.writeDouble(data[row][col]);
        dos.close();
        long t1 = System.nanoTime();
        System.out.println("\t" + (t1 - t0));
    }

    private final void rafSimpleWrite(final String dir) throws IOException {
        System.out.print("Consequent write raf simple ");
        long t0 = System.nanoTime();
        RandomAccessFile raf = new RandomAccessFile(dir + "raf simple.bin", "rw");
        double d;
        //Write header
        d = cols;
        raf.write(toByteArray(d));
        d = rows;
        raf.write(toByteArray(d));
        //Write data
        for (int row = 0; row < rows; row++)
            for (int col = 0; col < cols; col++)
                raf.write(toByteArray(data[row][col]));
        raf.close();
        long t1 = System.nanoTime();
        System.out.println("\t" + (t1 - t0));
    }

    private final void rafInOutWrite(final String dir) throws IOException {
        System.out.print("Consequent write raf DataOutput ");
        long t0 = System.nanoTime();
        RandomAccessFile raf = new RandomAccessFile(dir + "raf data.bin", "rw");
        double d;
        //Write header
        d = cols;
        raf.writeDouble(d);
        d = rows;
        raf.writeDouble(d);
        //Write data
        for (int row = 0; row < rows; row++)
            for (int col = 0; col < cols; col++)
                raf.writeDouble(data[row][col]);
        raf.close();
        long t1 = System.nanoTime();
        System.out.println("\t" + (t1 - t0));
    }

    private final void rafMapSimpleWrite(final String dir) throws IOException {
        System.out.print("Consequent write raf simple map ");
        long t0 = System.nanoTime();
        RandomAccessFile raf = new RandomAccessFile(dir + "raf simple map.bin", "rw");
        raf.setLength(((long)(2 + cols * rows)) * BYTE_IN_DBL);
        MappedByteBuffer buffer = raf.getChannel().map(FileChannel.MapMode.READ_WRITE, 0L, raf.length());
        DoubleBuffer doubleBuffer = buffer.asDoubleBuffer();
        double d;
        //Write header
        d = cols;
        doubleBuffer.put(d);
        d = rows;
        doubleBuffer.put(d);
        //Write data
        for (int row = 0; row < rows; row++)
            for (int col = 0; col < cols; col++)
                doubleBuffer.put(data[row][col]);
        buffer.force();
        raf.close();
        long t1 = System.nanoTime();
        System.out.println("\t" + (t1 - t0));
    }

    private final void controlData() {
        if (rows != rrow || cols != ccol)
            System.out.println("Incorrect header");
        for (int row = 0; row < rows; row++)
            for (int col = 0; col < cols; col++)
                if (control[row][col] != data[row][col]) {
                    System.out.println("Incorrect data in row " + row + " column" + col);
                    return;
                }
    }

    private final void textRead(final String dir) throws IOException {
        System.out.print("Consequent read text ");
        long t0 = System.nanoTime();
        StringTokenizer stk;
        BufferedReader br = new BufferedReader(new FileReader(dir + "Text.txt"));
        //Write header
        String line, s;
        double d;
        line = br.readLine();
        stk = new StringTokenizer(line);
        stk.nextToken(); //Skip title
        s = stk.nextToken();
        d = Double.parseDouble(s);
        ccol = (int)d;
        line = br.readLine();
        stk = new StringTokenizer(line);
        stk.nextToken(); //Skip title
        s = stk.nextToken();
        d = Double.parseDouble(s);
        rrow = (int)d;
        //Write data
        for (int row = 0; row < rows; row++) {
            line = br.readLine();
            stk = new StringTokenizer(line);
            for (int col = 0; col < cols; col++)
                control[row][col] = Double.parseDouble(stk.nextToken());
        }
        br.close();
        long t1 = System.nanoTime();
        System.out.println("\t" + (t1 - t0));
        controlData();
    }

    private final void simpleBinaryRead(final String dir) throws IOException {
        System.out.print("Consequent read simple ");
        long t0 = System.nanoTime();
        FileInputStream fis = new FileInputStream(dir + "simple.bin");
        //Write header
        fis.read(bytes);
        ccol = (int)fromByteArray();
        fis.read(bytes);
        rrow = (int)fromByteArray();
        //Write data
        for (int row = 0; row < rows; row++)
            for (int col = 0; col < cols; col++) {
                fis.read(bytes);
                control[row][col] = fromByteArray();
            }
        fis.close();
        long t1 = System.nanoTime();
        System.out.println("\t" + (t1 - t0));
        controlData();
    }

    private final void dataInOutRead(final String dir) throws IOException {
        System.out.print("Consequent read DataOutput ");
        long t0 = System.nanoTime();
        DataInputStream dis = new DataInputStream(new FileInputStream(dir + "data.bin"));
        //Write header
        ccol = (int)dis.readDouble();
        rrow = (int)dis.readDouble();
        //Write data
        for (int row = 0; row < rows; row++)
            for (int col = 0; col < cols; col++)
                control[row][col] = dis.readDouble();
        dis.close();
        long t1 = System.nanoTime();
        System.out.println("\t" + (t1 - t0));
        controlData();
    }

    private final void rafSimpleRead(final String dir) throws IOException {
        System.out.print("Consequent read raf simple ");
        long t0 = System.nanoTime();
        RandomAccessFile raf = new RandomAccessFile(dir + "raf simple.bin", "r");
        //Write header
        raf.read(bytes);
        ccol = (int)fromByteArray();
        raf.read(bytes);
        rrow = (int)fromByteArray();
        //Write data
        for (int row = 0; row < rows; row++)
            for (int col = 0; col < cols; col++) {
                raf.read(bytes);
                control[row][col] = fromByteArray();
            }
        raf.close();
        long t1 = System.nanoTime();
        System.out.println("\t" + (t1 - t0));
        controlData();
    }

    private final void rafInOutRead(final String dir) throws IOException {
        System.out.print("Consequent read raf DataOutput ");
        long t0 = System.nanoTime();
        RandomAccessFile raf = new RandomAccessFile(dir + "raf data.bin", "r");
        //Write header
        ccol = (int)raf.readDouble();
        rrow = (int)raf.readDouble();
        //Write data
        for (int row = 0; row < rows; row++)
            for (int col = 0; col < cols; col++)
                control[row][col] = raf.readDouble();
        raf.close();
        long t1 = System.nanoTime();
        System.out.println("\t" + (t1 - t0));
        controlData();
    }

    private final void rafMapSimpleRead(final String dir) throws IOException {
        System.out.print("Consequent read raf simple map ");
        long t0 = System.nanoTime();
        RandomAccessFile raf = new RandomAccessFile(dir + "raf simple map.bin", "r");
        MappedByteBuffer buffer = raf.getChannel().map(FileChannel.MapMode.READ_ONLY, 0L, raf.length());
        DoubleBuffer doubleBuffer = buffer.asDoubleBuffer();
        //Write header
        ccol = (int)doubleBuffer.get();
        rrow = (int)doubleBuffer.get();
        //Write data
        for (int row = 0; row < rows; row++)
            for (int col = 0; col < cols; col++)
                control[row][col] = doubleBuffer.get();
        buffer.force();
        raf.close();
        long t1 = System.nanoTime();
        System.out.println("\t" + (t1 - t0));
        controlData();
    }

    private final void controlDataRA() {
        for (int i = 0; i < reads; i++)
            if (contr[i] != data[coords[i][0]][coords[i][1]]) {
                System.out.println("Incorrect data in position " + i);
                return;
            }
    }


    private final void textReadRO(final String dir) throws IOException {
        System.out.print("Random order read text ");
        long t0 = System.nanoTime();
        StringTokenizer stk;
        String line;
        for (int i = 0; i < reads; i++) {
            //Reopen file
            BufferedReader br = new BufferedReader(new FileReader(dir + "Text.txt"));
            //Skip header lines
            br.readLine();
            br.readLine();
            //Skip preceeding rows
            for (int k = 0; k < coords[i][0]; k++)
                br.readLine();
            //Read needed line
            line = br.readLine();
            stk = new StringTokenizer(line);
            //Skip preceeding cols
            for (int k = 0; k < coords[i][1]; k++)
                stk.nextToken();
            contr[i] = Double.parseDouble(stk.nextToken());
            br.close();
        }
        long t1 = System.nanoTime();
        System.out.println("\t" + (t1 - t0));
        controlDataRA();
    }

    private final void simpleBinaryReadRO(final String dir) throws IOException {
        System.out.print("Random order read simple ");
        long t0 = System.nanoTime();
        long pos;
        for (int i = 0; i < reads; i++) {
            //Reopen file
            FileInputStream fis = new FileInputStream(dir + "simple.bin");
            //Calculate number of double which must be skipped
            pos = (2+coords[i][0] * cols + coords[i][1]) * BYTE_IN_DBL;
            //Skip header
            while (pos != 0)
                pos -= fis.skip(pos);
            //Read current value
            fis.read(bytes);
            contr[i] = fromByteArray();
            fis.close();
        }
        long t1 = System.nanoTime();
        System.out.println("\t" + (t1 - t0));
        controlDataRA();
    }

    private final void dataInOutReadRO(final String dir) throws IOException {
        System.out.print("Random order read DataOutput ");
        long t0 = System.nanoTime();
        long pos;
        for (int i = 0; i < reads; i++) {
            //Reopen file
            DataInputStream dis = new DataInputStream(new FileInputStream(dir + "data.bin"));
            //Calculate number of double which must be skipped
            pos = (2 + coords[i][0] * cols + coords[i][1]) * BYTE_IN_DBL;
            //Skip header
            while (pos != 0)
                pos -= dis.skip(pos);
            //Read current value
            contr[i] = dis.readDouble();
            dis.close();
        }
        long t1 = System.nanoTime();
        System.out.println("\t" + (t1 - t0));
        controlDataRA();
    }

    private final void rafSimpleReadRO(final String dir) throws IOException {
        System.out.print("Random order read raf simple ");
        long t0 = System.nanoTime();
        long pos;
        RandomAccessFile raf = new RandomAccessFile(dir + "raf simple.bin", "r");
        for (int i = 0; i < reads; i++) {
            //Calculate number of double which must be skipped
            pos = (2 + coords[i][0] * cols + coords[i][1]) * BYTE_IN_DBL;
            //Seek position
            raf.seek(pos);
            //Read current value
            raf.read(bytes);
            contr[i] = fromByteArray();
        }
        raf.close();
        long t1 = System.nanoTime();
        System.out.println("\t" + (t1 - t0));
        controlDataRA();
    }

    private final void rafInOutReadRO(final String dir) throws IOException {
        System.out.print("Random order read raf DataOutput ");
        long t0 = System.nanoTime();
        long pos;
        RandomAccessFile raf = new RandomAccessFile(dir + "raf data.bin", "r");
        for (int i = 0; i < reads; i++) {
            //Calculate number of double which must be skipped
            pos = (2 + coords[i][0] * cols + coords[i][1]) * BYTE_IN_DBL;
            //Seek position
            raf.seek(pos);
            //Read current value
            contr[i] = raf.readDouble();
        }
        raf.close();
        long t1 = System.nanoTime();
        System.out.println("\t" + (t1 - t0));
        controlDataRA();
    }

    private final void rafMapSimpleReadRO(final String dir) throws IOException {
        System.out.print("Random order read raf simple map ");
        long t0 = System.nanoTime();
        int pos;
        RandomAccessFile raf = new RandomAccessFile(dir + "raf simple map.bin", "r");
        MappedByteBuffer buffer = raf.getChannel().map(FileChannel.MapMode.READ_ONLY, 0L, raf.length());
        DoubleBuffer doubleBuffer = buffer.asDoubleBuffer();
        for (int i = 0; i < reads; i++) {
            //Calculate number of double which must be skipped
            pos = 2 + coords[i][0] * cols + coords[i][1];
            //Read current value
            contr[i] = doubleBuffer.get(pos);
        }
        buffer.force();
        raf.close();
        long t1 = System.nanoTime();
        System.out.println("\t" + (t1 - t0));
        controlDataRA();
    }

}

Результаты теста следующие (время в секундах):
                                                Последовательная Последовательное    Чтение в 
                                                             запись                   чтение          случайном порядке
Текстовый файл                                            1.993      0.867    1,343.343
Простейшие бинарные                                   7.289      4.967          3.683
Бинарные с интерфейсом DataOutput            13.611      4.904          3.945
Прямого доступа простые                              7.639      4.955          0.165
Прямого доступа с интерфейсом DataOutput  54.617    37.470           0.844
Прямого доступа с отображением в памяти     0.107      0.020          0.006

Получается, что при последовательном доступе самые быстрые из файлов без отображения в памяти являются текстовые файлы, что полностью противоречит моим воспоминаниям о работе с файлами в Дельфи.
Самые быстрые - файлы с отображением в памяти. Это не вызывает вопросов. А вот почему бинарные файлы настолько медленнее текстовых вогнало меня в ступор.


Это сообщение отредактировал(а) Mirkes - 14.4.2014, 19:57


--------------------
Mirkes
PM MAIL   Вверх
LSD
Дата 15.4.2014, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Mirkes @  14.4.2014,  20:52 Найти цитируемый пост)
А вот почему бинарные файлы настолько медленнее текстовых вогнало меня в ступор.

Вероетно потому что для текстовых фалов используется буферезированый Writer, а для бинарных - нет.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Mirkes
Дата 15.4.2014, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 7
Всего: 17



Цитата(LSD @ 15.4.2014,  10:51)
Цитата(Mirkes @  14.4.2014,  20:52 Найти цитируемый пост)
А вот почему бинарные файлы настолько медленнее текстовых вогнало меня в ступор.

Вероетно потому что для текстовых фалов используется буферезированый Writer, а для бинарных - нет.

А существуют буферизованные версии для бинарных файлов? Я их не нашел  smile 


--------------------
Mirkes
PM MAIL   Вверх
LSD
Дата 15.4.2014, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



BufferedOutputStream враппер для любого бинарного стрима.
Ты же и для используешь враппер:
Код

BufferedWriter bw = new BufferedWriter(new FileWriter(dir + "Text.txt"));

точно так использется BufferedOutputStream.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Mirkes
Дата 15.4.2014, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 7
Всего: 17



Спасибо LSD, сейчас подшаманю и посмотрю что выйдет.


--------------------
Mirkes
PM MAIL   Вверх
Mirkes
Дата 15.4.2014, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 7
Всего: 17



Погнал тест по новой добавив буферизацию файлов:
Код

                                            Последовательная Последовательное    Чтение в 
                                            запись            чтение            произвольном порядке
Текстовый файл                                1.993              0.867              1,343.343
Простейшие бинарные                           7.289              4.967                  3.683
Буферизованный простейший бинарный            0.250              0.205                  3.928
Бинарные с интерфейсом DataOutput            13.611              4.904                  3.945
Буферизованный с интерфейсом DataOutput       0.130              0.123                  4.531
Прямого доступа простые                       7.639              4.955                  0.165
Прямого доступа с интерфейсом DataOutput     54.617             37.470                  0.844
Прямого доступа с отображением в памяти       0.107              0.020                  0.006


Спасибо LSD, теперь все соответствует ожиданиям, за исключением файлов прямого доступа без отображения в память. А вообще-то это круто, буферизация ускорила работу более чем в 30 раз при последовательных операциях, которые, по моему опыту, составляют большую часть работы с файлами. Интересно, это открытие только для меня? smile 
Еще раз большое спасибо LSD


--------------------
Mirkes
PM MAIL   Вверх
LSD
Дата 16.4.2014, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Mirkes @  15.4.2014,  20:41 Найти цитируемый пост)
теперь все соответствует ожиданиям, за исключением файлов прямого доступа без отображения в память

Это ты про RandomAccessFile ? Ну так там тоже все ясно, там тоже нет буфферизации. Попробуй читать/писать блоками по 64К выровненными по границе 4К и увидишь и блоками по 20 байт без выравнивания.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Mirkes
Дата 16.4.2014, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 7
Всего: 17



Цитата(LSD @  16.4.2014,  10:31 Найти цитируемый пост)
Это ты про RandomAccessFile ? Ну так там тоже все ясно, там тоже нет буфферизации. Попробуй читать/писать блоками по 64К выровненными по границе 4К и увидишь и блоками по 20 байт без выравнивания. 

Это, то я понимаю. Но городить своими руками буферизацию не хочется. Лучше я буду работать по принципу - последовательная обработка с помощью буферизованных последовательных версий, а когда нужен действительно прямой доступ, так RandomAccessFile и так работает быстрее всех остальных. А если получится подключить отображение в память, то вообще шустро.


--------------------
Mirkes
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0602 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.