хранение массива в файле в Java - PullRequest
1 голос
/ 01 октября 2009

Я планирую хранить массив чисел в файле и читать его при необходимости. Что было бы хорошим способом сделать это? Я могу придумать несколько способов, таких как сохранение каждого элемента в строке в виде текстового файла или его сериализация и сохранение / вызов этим методом. Скорость - моя первая забота.

Спасибо

Ответы [ 9 ]

6 голосов
/ 01 октября 2009

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

Встроенный механизм сериализации делает все это за вас и, возможно, наиболее эффективным способом.

3 голосов
/ 01 октября 2009
new ObjectOutputStream(new FileOutputStream("s")).writeObject(new ArrayList());

Файл сохранен.

2 голосов
/ 01 октября 2009

Если скорость - ваша основная задача, используйте DataOutputStream и DataInputStream, чтобы сериализовать ее в двоичном виде. что-то вроде:

public void write(DataOutput dout, int arr[]) throws IOException
{
    dout.writeInt(arr.length);
    for(int a : arr) dout.writeInt(a);
}

public int[] readArray(DataInputStream din) throws IOException
{
    int arr[] = new int[din.readInt()];
    for(int i=0;i<arr.length;i++)
        arr[i] = din.readInt();

    return arr;
}

если даже это не достаточно быстро, рассмотрите возможность использования IntBuffer для массовых операций.

Преимущества двоичной формы:

  1. Вы читаете и пишете меньше данных, потому что двоичные данные более компактны, чем текст, читаемый человеком, что означает IO менее значимым.
  2. Вы сохраняете циклы процессора при разборе данных из текстового формата в целые числа.
2 голосов
/ 01 октября 2009

Скорость в этом контексте является второстепенной проблемой. Зачем? Потому что вы все равно читаете файл , а ввод / вывод медленный (по сравнению с операциями в памяти). Я бы просто сохранил их по одному числу в строке, чтобы они были удобочитаемыми.

1 голос
/ 02 октября 2009

Это может быть излишним, но вы можете также подумать, как JSON аккуратно обрабатывает свой ключ: значение, данные на основе массива. Вы можете сохранить ваши массивы, как это в одном файле { "myArrays": { «1»: «[0 1 2 3 4 5]» "2": "[0 1 2 3 4 5]"

   "n" : "[0 1 2 3 4 5]"
 }
}

Чтобы извлечь массивы, прочитайте содержимое файла и сохраните их в StringBuffer, сериализуйте (например, net.sf.json.JSONSerializer) в объект JSON и выполните итерацию по каждому набору массивов.

1 голос
/ 01 октября 2009

Новый подход: если ваш массив чисел представляет собой уникальные целые числа, вы можете записать их как закодированный «набор битов» для длины серии. Это дало бы очень компактное представление, означающее меньшее количество операций ввода-вывода. Я бы предложил этот подход для хранения очень больших массивов уникальных целых чисел.

Например, предположим, что ваш массив содержит значения [1 ,2 ,3 ,5 ,9], ваш набор битов будет выглядеть так:

[1, 0, 0, 0, 1, 0, 1, 1, 1]

... и ваш кодированный бит RLE будет:

013113

... что интерпретируется как «0 нулей, 1 один, 3 нуля, 1 один и т. Д.».

Вы можете сохранить строку в кодировке RLE в виде символов или использовать двоичный формат.

1 голос
/ 01 октября 2009

Недостаточно информации о вашем сценарии использования, чтобы узнать наилучшую скорость захода на посадку. (будет ли это многопоточным, как часто это будет выполняться, каков размер массива и тому подобное).

Как говорится, единственный реальный способ узнать это - описать их. Сериализация тривиальна, и написание одного числа в строке также довольно тривиально, так что вы можете попробовать эти два, профилировать их в соответствии с типом сценария, который вам нужен, посмотреть, какой из них быстрее, и посмотреть, достигнет ли какой-либо из них целевой производительности. 1003 *

1 голос
/ 01 октября 2009

Если вы когда-нибудь захотите сохранить массив чисел, тогда подойдет ваша собственная процедура сериализации / десериализации вручную. Это научит вас кое-чему об операциях ввода-вывода.

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

Хотя я не Java-разработчик, выглядит довольно просто использовать сериализацию в Java. Похоже, у Sun хорошее представление о сериализации Java.

http://java.sun.com/developer/technicalArticles/Programming/serialization/

0 голосов
/ 01 октября 2009

После сериализации это лучший способ. Но если вас беспокоит скорость, сериализация - не верный вариант. (Производительность сериализации низкая).

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