Рекомендации по созданию большого CSV-файла для Java IO

Привет, мне нужно создать несколько больших CSV-файлов, порядок которых может составлять 2 миллиона. мне было интересно, как сделать это эффективно.. и поэтому у меня возникает мало вопросов.--1-->

1 . когда мы пишем файл через BufferedWriter, как часто мы должны смывать? однако я думаю, что bufferedWriter поддерживает свой собственный буфер, и он автоматически сбрасывает его после заполнения буфера, если это так, то почему метод flush существует вообще ??

  1. как файл i собираюсь создать бы большой . Итак, когда я начну писать файл, файл будет автоматически зафиксирован на диске?? (прежде чем позвонить писателю.закрыть ()) или весь файл остается в основной памяти, пока я не закрою писатель?.

    • совершая, я имею в виду, что никакая часть уже написанной части не находится в основной памяти i.e он готов к GC

4 ответов


  1. на BufferedWriter реализация должна делать довольно хорошую работу по промывке, когда это необходимо. В вашем случае вам никогда не нужно звонить flush.

    что касается того, почему есть flush метод, это потому, что иногда вы хотите, чтобы вывод был написан немедленно, а не ждал BufferedWriterбуфер становится полным. BufferedWriter не только для файлов; он также может использоваться для записи на консоль или сокет. Например, вы можете отправить некоторые данные через сеть, но не совсем достаточно данных, чтобы вызвать BufferedWriter для автоматического смыва. Чтобы отправить эти данные немедленно, вы должны использовать flush.

  2. все данные, которые вы написали к BufferedWriter не останется в памяти всех одновременно. Выписывается по кусочкам (смывается) как 'ы заполняет. Как только вы позвоните close в конце BufferedWriter сделает еще один окончательный флеш для всего, что осталось в его буфере, что он еще не записал на диск и закрыть файл.


Если вы обертываете свой writer в BufferedWriter, вы указываете количество байтов, которые должны быть сохранены в памяти до физической записи на диск. (Если вы не укажете, есть значение по умолчанию. Я думаю, что это 8k, но, пожалуйста, Не цитируйте это как Евангелие.)

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

другие авторы пишут на диск с каждым вызовом ввода-вывода. Буферизации нет. Что обычно приводит к отстойной производительности. Вот почему все писатели диска быть завернутым в BufferedWriter.


мое наклонение было бы работать в сегментах, смывая на диск после каждых 1K или 2K строк. С таким количеством данных, это, казалось бы, толкает предел памяти. Поскольку эта операция, вероятно, будет медленной, сбой на безопасной стороне и запись на диск часто.

Это мои $ 0.02 в любом случае:)


BufferedWriter использует буфер фиксированного размера и автоматически смывается, когда буфер заполняется. Следовательно, любой большой файл будет записываться кусками.

метод flush существует, потому что иногда вы можете написать что-то на диск до заполнения буфера. Типичным примером является BufferedWriter, обертывающий SocketOutputStream. Если у вас:

writer.write(request);
reader.read(response);

ваш поток, вероятно, будет блокировать бесконечно, потому что запрос не будет отправлен, пока буфер не заполнится. Ты поэтому:

writer.write(request);
writer.flush(); // make sure the request is sent now
reader.read(response);
.