|
|
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, прошу помочь мне с советом. Необходимо выгрузить данные из базы на firebird, записей много, около 15 миллионов. В файл типа .txt, с табуляцией. Попробовала написать экзешник, который вставлял бы по строке в файл. Работает, но долго. Подскажите пожалуйста решение! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 15:47 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
Кареглазая_зая, Взять IBE - он уже умеет экспорт данных. В плане программирования - накапливать буфер в памяти и сбрасывать на диск не по 1 строке, а порциями по 10-20 тыс строк например. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 15:51 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
Кареглазая_зая, Ну а как долго? Сколько? Длина записи какая? Может чудес не бывает. 15 млн x 100 байт = ~1.5Гиг. Какое время Вас бы устроило? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 15:57 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
KreatorXXI, ну вот один файл сформировался за 3 часа , примерно 4 мб. Это я разделила по месяцам и по одному признаку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 16:05 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
DarkMaster, умеет, но с моими объемами не справляется. Я пробовала, он выгружает сначала все, а только потом начинает экспорт ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 16:06 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
Кареглазая_зая, Ну тогда пиши свой велосипед, я уже сказал как. Советую использовать кстати не Query, а что-то вроде Cursor`а (однонаправленный, не имеет внутреннего буфера для данных) - но это уже зависит от библиотеки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 16:18 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
Кареглазая_заяKreatorXXI, ну вот один файл сформировался за 3 часа , примерно 4 мб. Это я разделила по месяцам и по одному признаку 4 мб - это не 15 млн записей. Но по любому многовато. Не знаю на чём Вы писали, но сброс в текстовый файл должен быть быстр. Сегодня вот здесь обсуждают - 21737021 . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 16:19 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
Кареглазая_зая, Так все равно так или иначе все это придется вытягивать по сети. Ваша пробная программа экспорта на чем написана? Покажите примерный алгоритм, подумаем над его оптимизацией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 16:20 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
DarkMaster, и писать данные в Stream. А в Query однонаправленнность и так можно включить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 16:21 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисDarkMaster, и писать данные в Stream. А в Query однонаправленнность и так можно включить Ну я привык за много лет к IBO - там есть специализированный TIB_Cursor для таких целей. Query (даже однонаправленная) - это память под зафетченные данные - доп. тормоза по выделению памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 16:24 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
DarkMaster, нет в однонаправленных Query предыдущие фетчи не буферизированы, иначе какой в смысл в однонаправленности. Разве что буфер в SQLDA, но он один на все записи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 16:27 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
Vlad F, Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 16:40 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
Кареглазая_заяDarkMaster, умеет, но с моими объемами не справляется. Я пробовала, он выгружает сначала все, а только потом начинает экспорт Умеет и справляется. http://www.ibexpert.net/ibe/index.php?n=Doc.ScriptExecutive#Output ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 16:51 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
Кареглазая_зая, запрос — источник данных должен быть один. Пиши в FileStream, не надо переоткрывать файл на каждой иттерации. Для большего быстродействия у Query должно быть выставлено Uniderictional := true ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 16:54 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
Не мудрено, что оно тупит, за ради каждой строчки открывать-закрывать файл, препарировать запрос на каждый чих. Зачем внутри цикла переопределять запрос? Ужас-ужас, короче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 16:56 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
Кареглазая_зая, срочно читаем http://www.ibase.ru/ibx/ TIBOutputDelimitedFile обращаю внимание, что запрос должен выполняться в IBSQL, а не в IBQuery или чем-то еще. а 4мб выгрузки у вас за 3 часа - потому что вы дрюкаете сервер запросом на выгрузку каждой записи. Код: pascal 1. 2. 3. 4. 5. прямо хоть в учебники, "как не надо делать". Должен быть ОДИН запрос, выдающий все записи, которые надо выгрузить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 16:58 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
ЭТО с ЭТИМ, в форум по Делфи! Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 17:06 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
Кареглазая_заяПодскажите пожалуйста решение! FBExport. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 17:11 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
Дело в том, что есть две базы, которые необходимо связать между собой уидом, его я как раз вытаскиваю запросом для каждой записи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 17:42 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисDarkMaster, нет в однонаправленных Query предыдущие фетчи не буферизированы, иначе какой в смысл в однонаправленности. Разве что буфер в SQLDA, но он один на все записи Ну, когда-то и я наверное это знал, теперь забыл :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 17:45 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
Кареглазая_заяДело в том, что есть две базы, которые необходимо связать между собойШтуковина, которая вам нужна называется репликатор. Будет гораздо дешевле его купить, учитывая насколько "детские" грабли разложены в вашем коде, отлаживать будете долго и мучительно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 17:50 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
Кареглазая_зая, Вот это я не до конца понял, и поэтому прежде чем давать советы по оптимизации приведенного кода, хочу уточнить, как потом предполагается использовать этот текстовый файл с разделителями? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 19:37 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
Кареглазая_заяДело в том, что есть две базы, которые необходимо связать между собой уидом, его я как раз вытаскиваю запросом для каждой записи Вот про это был вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 19:38 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
МимопроходящийЭТО с ЭТИМ, в форум по Делфи! Не спугни Заю, противный. Вишь, как все мужики оживились.)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 19:46 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
Vlad F, предполагается загрузить эти файлы в базу ms sql. Информация нужна стороннему аудитору ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 20:10 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
Кареглазая_зая, Загружаете вы или они? И имеется ли вариант написать на том же Delphi для них свой загрузчик? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 20:25 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
Vlad F, они. Какой загрузчик? Мы можем передать только обезличенные данные, по сути в любом формате ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2018, 08:48 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
Кареглазая_зая, Если в любом, то сможете ли передать (с тем, чтобы они потом переварили) в cds-формате, который есть ClientDataset.SaveToFile()? Тогда бы все сильно упростилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2018, 08:58 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
Кареглазая_зая, https://stella-npf.ru/download/zls_sql-exe/ Модератор: Тема перенесена из форума "Firebird, InterBase". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2018, 09:00 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
1 - вынести присвоение текстов запросов за цикл 2 - не переоткрывать файл на каждую строчку 3 - закомментировать WriteString и посмотреть, сколько займет выборка, чтобы понять, что тормозит именно она 4 - выборка из одной БД по набору ключей из другой БД, на самом деле, не так уж тривиальна. Пока что мне приходит в голову а) генерация списка из 10-20 значений для подстановки в select .. where .. in (..,..,..) - чисто клиентское решение, но не особо хорошее б) добавление всех ключей во временную таблицу в БД2 и потом уже выборка одним запросом - потребует изменений в БД ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2018, 10:44 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
А есть возможность сначала сделать средствами самой базы результирующую таблицу и потом тупо выбирать ее в TStringList и сохранять через TStringsList.SaveToFile? Если прямолинейно подходить и задача разовая, то я бы, наверное, именно так и начал. Ну и компилил в 64 бита, т. к. пугает перспектива Out of memory. Вариант, порезать кусков на 10 и потом склеить. Для TStringList сразу ставить нужную емкость. При обращении к полям на таких объемах разумеется никаких FieldByName. Склейку можно делать через TStringBuilder, но что-то мне подсказывает выигрыш от него будет ничтожен на фоне затрат на запись в файл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2018, 13:37 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
Правильное замечание насчет FieldByName, но это всё копейки на фоне 15М выполнений запросов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2018, 14:01 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
Поэтому и говорю, что лучше сначала создать в самой базе одну таблицу, которую можно экспортировать элементарным перебором. При этом у меня вопросы относительно того, как себя поведет тот же TStringList на 15 млн строк тоже есть. Я недавно делал простейший самоочищающийся лог через TMemo, изначально у меня при превышении N строк удалялась нулевая, но это даже при 1000 строчек запросто вгоняло проц в 100% загрузку при отправке в Memo полусотни строк в секунду. Просто на перераспределении памяти и переборе всех этих строчек с их счетчиками ссылок. Автор не пишет, какая у нее версия Delphi, здесь я вижу потенциальную подлянку, что в базе могут быть обычные строки, а в Delphi юникодовые. Или наоборот. Возможно, есть смысл, сразу выделить память под короткие строки, если их достаточно, и потом ручками через Stream писать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2018, 14:21 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
Василий 2на фоне 15М выполнений запросов Да их тут даже не 15М, а 30М... к БД1 тоже каждый раз обращение. Эту выборку надо объединить, сразу вычерпывая в dsetReestr2 все нужные поля. То есть Код: pascal 1. 2. 3. 4. 5. На месте "(здесь думать дальше)" - уже более интересные вещи. Как ни выжимай скорость, один запрос со всей обвязкой займет пусть 100 мс. 15М таких запросов - 17 суток. Поэтому надо всеми силами сокращать количество запросов. Для этого надо знать, доступно ли изменение схемы БД2, и вообще саму схему. К примеру, № полиса - разве не уникальное значение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2018, 14:22 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
BeltarПри этом у меня вопросы относительно того, как себя поведет тот же TStringList на 15 млн строк тоже есть. Зачем стринглист? Это лишняя прослойка. Обычный WriteLn (без открытия-закрытия на каждую строку, конечно) и всё. Ну или FileStream, если хочется более модного. Такие объемы хранить стоит только в крайнем случае, обычно их гоняют поточно авторПоэтому и говорю, что лучше сначала создать в самой базе одну таблицу, которую можно экспортировать элементарным перебором. Именно. Либо целиком, либо по кускам, если памяти не хватает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2018, 14:27 |
|
||
|
Выгрузка из базы
|
|||
|---|---|---|---|
|
#18+
Ничего быстрее WriteLn нет и не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2018, 14:39 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2040100]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
177ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 247ms |
| total: | 501ms |

| 0 / 0 |
