Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Реализовать экспорт из БД во внешний файл / 22 сообщений из 22, страница 1 из 1
17.11.2016, 16:11
    #39349225
just_vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализовать экспорт из БД во внешний файл
Всем привет!
Есть, вроде бы простая задача - сформировать csv файл на десятки - сотни млн записей, сами записи берутся из БД.

Обычно, когда записей немного, практикую сценарий, что из ResultSet читаю в некую коллекцию, потом с ней работаю, то есть отдельный метод получающий коллекцию из БД, отдельный метод преобразующий коллекцию в файл нужного формата. Но если это десятки-сотни миллионов записей, то все это успешно свалится по памяти. Соответственно два варианта, как это можно сделать:
1. В одном методе совместить чтение из БД и генерацию файла. Вариант рабочий, но как то не эстетичный чтоли ...
2. Сделать многопоточно, producer/consuer в одном потоке читаем, в другом генерируем файл. Стильно/модно/молодежно, но ощущение, что из пушки по воробьям.

У кого какие мысли/советы?
...
Рейтинг: 0 / 0
17.11.2016, 16:17
    #39349231
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализовать экспорт из БД во внешний файл
Что за БД такая экзотическая, что там нет экспорта в CSV?
Нет никаких непреодолимых препядствий реализовать №1 эстетично.
№2 тоже можно, но пользы исключительно можно получить в производительности, а не в эстетике.
...
Рейтинг: 0 / 0
17.11.2016, 16:22
    #39349237
just_vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализовать экспорт из БД во внешний файл
БД то не экзотичная, политика партии экзотичная, что это надо сделать силами другого сервера :-)
Как пункт №1 может быть сделан эстетично, я чет даже не представляю, можете хотя бы на словах обрисовать?
...
Рейтинг: 0 / 0
17.11.2016, 16:32
    #39349252
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализовать экспорт из БД во внешний файл
just_vladimirБД то не экзотичная, политика партии экзотичная, что это надо сделать силами другого сервера :-)
Пфф. Чтение записей будет производится всё равно силами БД сервера. Остальное - вопрос того куда писать. На CPU нагрузка смешная в такой задаче.

just_vladimirКак пункт №1 может быть сделан эстетично, я чет даже не представляю, можете хотя бы на словах обрисовать?
Да, хотя бы через Consumer-а.
Класс чтения из бд скармливает данные в Consumer, который реализован в классе записи в CSV. Всё эстетично, работа с СSV и БД разделена.
Кстати, использовал относительно недавно Apache Commons CSV - понравилось.
...
Рейтинг: 0 / 0
17.11.2016, 16:57
    #39349292
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализовать экспорт из БД во внешний файл
just_vladimirОбычно, когда записей немного, практикую сценарий, что из ResultSet читаю в некую коллекцию, потом с ней работаю, то есть отдельный метод получающий коллекцию из БД, отдельный метод преобразующий коллекцию в файл нужного формата. Но если это десятки-сотни миллионов записей, то все это успешно свалится по памяти.
У тебя логика есть?
Что свалится по памяти, если ты НЕ будешь писать в коллекцию? А сразу экспорт?
...
Рейтинг: 0 / 0
17.11.2016, 17:05
    #39349303
just_vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализовать экспорт из БД во внешний файл
Petro123just_vladimirОбычно, когда записей немного, практикую сценарий, что из ResultSet читаю в некую коллекцию, потом с ней работаю, то есть отдельный метод получающий коллекцию из БД, отдельный метод преобразующий коллекцию в файл нужного формата. Но если это десятки-сотни миллионов записей, то все это успешно свалится по памяти.
У тебя логика есть?
Что свалится по памяти, если ты НЕ будешь писать в коллекцию? А сразу экспорт?
Чукча не читатель, чукча писатель?
...
Рейтинг: 0 / 0
17.11.2016, 17:17
    #39349311
Vladimir Baskakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализовать экспорт из БД во внешний файл
голосую за пункт 1. Потому что представить себе как в 1 csv-файл пишкт много потоков сразу - не могу. ну и пусть себе пишет по мере фетча из базы. накручивать историю вокруг совсем простого по моему незачем, а так, в принципе конечно можно....
...
Рейтинг: 0 / 0
17.11.2016, 17:19
    #39349315
just_vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализовать экспорт из БД во внешний файл
Всем спасибо, сошлись на первом варианте :-)
...
Рейтинг: 0 / 0
17.11.2016, 17:24
    #39349321
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализовать экспорт из БД во внешний файл
Vladimir Baskakovголосую за пункт 1. Потому что представить себе как в 1 csv-файл пишкт много потоков сразу - не могу. ну и пусть себе пишет по мере фетча из базы. накручивать историю вокруг совсем простого по моему незачем, а так, в принципе конечно можно....
Ну, два потока вполне могли бы немного ускорить процесс. Тогда бы запись и чтение не ждали друг-друга. Но целесообразность такого решения сомнительна. Врядли время работы изменится на порядок.
...
Рейтинг: 0 / 0
17.11.2016, 17:31
    #39349329
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализовать экспорт из БД во внешний файл
just_vladimirВсем спасибо, сошлись на первом варианте :-)
попробуй это
Код: java
1.
try (Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);) {


и \ или это
Код: java
1.
stmt.setFetchSize(1); 


не должна расти при фетче по миллиарду.
...
Рейтинг: 0 / 0
17.11.2016, 18:20
    #39349370
Vladimir Baskakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализовать экспорт из БД во внешний файл
BlazkowiczVladimir Baskakovголосую за пункт 1. Потому что представить себе как в 1 csv-файл пишкт много потоков сразу - не могу. ну и пусть себе пишет по мере фетча из базы. накручивать историю вокруг совсем простого по моему незачем, а так, в принципе конечно можно....
Ну, два потока вполне могли бы немного ускорить процесс. Тогда бы запись и чтение не ждали друг-друга. Но целесообразность такого решения сомнительна. Врядли время работы изменится на порядок.

согласен. но, инфрастуктурные расходы на взаимодействие потоков..... в общем, по мне - это того не стОит. база внутри себя и так готовится отдать, файловая система буферизует вывод.... все стараются как могут, не надо им мешать.
...
Рейтинг: 0 / 0
17.11.2016, 19:03
    #39349386
just_vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализовать экспорт из БД во внешний файл
Petro123,
вы видимо сегодня как то совсем на своей волне, у меня нет никаких проблем с написанием работающего кода, вообще никаких (в том числе с подбором правильных настроек jdbc), вопрос был в том, что я не хотел совмещать работу с БД и генерацию файла в одном методе. И уж тем более неуместны Ваши саркастические "рекомендации" (вредные советы) про fetchSize=1.
...
Рейтинг: 0 / 0
17.11.2016, 19:08
    #39349388
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализовать экспорт из БД во внешний файл
Vladimir Baskakovсогласен. но, инфрастуктурные расходы на взаимодействие потоков...

Пф. Что за сферических расходы в вакууме? Обычная очередь.
...
Рейтинг: 0 / 0
17.11.2016, 19:18
    #39349397
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализовать экспорт из БД во внешний файл
just_vladimir,
Вы сначала научитесь формулировать вопрос внятно.
Тогда вам и отвечать будут коротко)).
Зачем и почему у вас 1 метод. А не 2 или даже 3 класса?
Суть в коллекции, а не в то что вы тут пишите.
Нет проблем, не приходите).
Удачи!
...
Рейтинг: 0 / 0
17.11.2016, 19:41
    #39349420
just_vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализовать экспорт из БД во внешний файл
Petro123,
вопрос поняли все отписавшиеся, кроме вас ;)
...
Рейтинг: 0 / 0
17.11.2016, 20:02
    #39349433
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализовать экспорт из БД во внешний файл
just_vladimir,
Жду еще тебя с такими вопросами).
Про одну процедуру.
...
Рейтинг: 0 / 0
17.11.2016, 22:32
    #39349508
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализовать экспорт из БД во внешний файл
just_vladimir,
получить из бд готовую строку csv - нет проблем, записать эту строку в файл — тож без проблем. и это в цикле. все просто
...
Рейтинг: 0 / 0
18.11.2016, 17:19
    #39350005
golovonometr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализовать экспорт из БД во внешний файл
BlazkowiczVladimir Baskakovсогласен. но, инфрастуктурные расходы на взаимодействие потоков...

Пф. Что за сферических расходы в вакууме? Обычная очередь.
Не совсем обычная, ArrayBlockingQueue какая нибудь))

А по сабжу, не понятно зачем ТС в коллекцию пихает данные? Сразу писать в файл?
...
Рейтинг: 0 / 0
18.11.2016, 17:23
    #39350009
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализовать экспорт из БД во внешний файл
golovonometrНе совсем обычная, ArrayBlockingQueue какая нибудь))

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

golovonometrА по сабжу, не понятно зачем ТС в коллекцию пихает данные? Сразу писать в файл?
Ну, вот он и справшивает, как сразу писать в файл, но чтобы в одном и том же методе не было работы как JDBC, так и с File IO.
...
Рейтинг: 0 / 0
19.11.2016, 10:32
    #39350235
Vladimir Baskakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализовать экспорт из БД во внешний файл
А что дальше будет с этими csv, вот вопрос. Это промежуточное звено наверное, и вот возможно канал данных просится - нужно ли процессу обработчику видеть все целиком.
...
Рейтинг: 0 / 0
19.11.2016, 12:02
    #39350252
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализовать экспорт из БД во внешний файл
авторНу, вот он и справшивает, как сразу писать в файл, но чтобы в одном и том же методе не было работы как JDBC, так и с File IO.
и это
авторсформировать csv файл на десятки - сотни млн записей, сами записи берутся из БД.
только если есть N гиг памяти на компе.
...
Рейтинг: 0 / 0
19.11.2016, 12:59
    #39350263
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализовать экспорт из БД во внешний файл
вадятолько если есть N гиг памяти на компе.
И ты туда же. Рукалицо.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Реализовать экспорт из БД во внешний файл / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]