Литье дорогая операция? - PullRequest
5 голосов
/ 17 декабря 2010

Сценарий :

  • Я анализирую большой файл (файл символов).Например, файл .csv (не совсем в моем случае)
  • Я не могу хранить весь файл в памяти.Поэтому я должен реализовать буферную стратегию.
  • Я хочу создать универсальный обработчик, который будет хранить постоянное количество строк в памяти (как строки).Этот обработчик извлекает другие строки, если это необходимо, при удалении ненужных строк.
  • В этом обработчике я создам синтаксический анализатор, который преобразует строки в объекты Java и обрабатывает изменения на этих объектах.После внесения изменений (обновите некоторые поля объектов) сохраните изменения обратно в файл.

Должен ли я :

  • Вместосохранить буфер как массив строк, я должен сохранить буфер непосредственно как объекты (делая единственное приведение)?или ...
  • Сохраняйте буфер в виде строк, каждый раз, когда мне нужно работать с буфером, приводить информацию к нужному объекту, вносить изменения, сохранять изменения обратно в файл.Последовательные операции потребуют дополнительных приведений.

Мне придется все упростить.Есть предложения?

Ответы [ 4 ]

8 голосов
/ 17 декабря 2010

Приведение не меняет объем памяти, занимаемый объектом.Он просто меняет тип среды выполнения.

Если вы можете выполнять эти операции для каждой строки, то просто выполняйте операцию непосредственно внутри цикла, в котором вы читаете одну строку.

while ((line = reader.readLine()) != null) {
    line = process(line);
    writer.println(line);
}

Таким образом, каждый раз вместо целого файла вы фактически получаете только одну строку в памяти Java.

Или если вам нужно выполнить эти операции на основе всего файла CSV(т. е. эти операции зависят от всех строк), тогда наиболее эффективный вариант - импортировать файл CSV в реальную базу данных SQL, а затем использовать операторы SQL для изменения данных и затем экспортировать их в файл CSV.еще раз.

3 голосов
/ 17 декабря 2010

Я бы порекомендовал использовать MappedByteBuffer (из NIO), который вы можете использовать для чтения файла, слишком большого для размещения в памяти. Он отображает только область файла в память; как только вы закончите читать этот регион (скажем, первые 10 Кб), отобразите следующий и т. д., пока не прочитаете весь файл. Эффективно использует память и достаточно прост в реализации.

2 голосов
/ 17 декабря 2010

Java Cast: как

Object a = new String();
String b (String) a;

не дорого. - Неважно, если вы бросили строки или любой другой тип.

1 голос
/ 17 декабря 2010

Реальным добавлением будет чтение каждой строки в виде строки, что довольно просто в Java.После того, как он находится в строке, тривиально разбить строку на каждую запятую с помощью

String[] row = parsedRow.split(",");

. У вас будет строка для каждого значения в массиве, которое затем можно будет использоватьна.

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