Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2010.03.07;
Скачать: [xml.tar.bz2];

Вниз

5 миллионов записей   Найти похожие ветки 

 
Программер   (2009-02-19 08:41) [0]

Как экспортировать 5 миллионов записей из запроса к ораклу в accseess?
Пытаюсь через adoquery но он вроде грузит записи в память и она переполняется. Пытался сохранять в эксель через TscExcelExport. но в экселе болше 65 тыс. строк на одном листе не сохраняет. На разных листах боюсь не справится.


 
Sergey13 ©   (2009-02-19 08:54) [1]

DataPump?


 
Сергей М. ©   (2009-02-19 09:08) [2]


> н вроде грузит записи в память


http://sources.ru/delphi/delphi_ado_cursors.shtml

см. "CursorLocation"


 
DrPass ©   (2009-02-19 10:35) [3]

Боюсь, Access от пяти мегазаписей может удавиться...


 
Программер   (2009-02-19 11:24) [4]

Спасибо, будем разбиратся!
Access посмотрим сколько влезет в него :)
У меня csv файл 700 мегов весит с этими записями.


 
Kinda   (2009-02-19 12:06) [5]

Внего влезет не более 2Гб эсли аксесс не 2007
и не более 4Гб в противном случае.

П.С. Имортировать можно из csv или txt если по размеру пройдет


 
Сергей М. ©   (2009-02-19 12:10) [6]


> DrPass ©   (19.02.09 10:35) [3]


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


 
Kinda   (2009-02-19 12:12) [7]

Поправлюсь, ограничения указаны на размер базы аксесс, а не csv и т.п.


 
Petr V. Abramov ©   (2009-02-19 14:07) [8]

я думаю, проще из Access приликоваться к ораклу и штатными средствами Access перелить


 
Виталий Панасенко   (2009-02-19 14:26) [9]


> Программер   (19.02.09 08:41)
>
> Как экспортировать 5 миллионов записей из запроса к ораклу
> в accseess?
> Пытаюсь через adoquery но он вроде грузит записи в память
> и она переполняется.

А почему-бы не использовать ADOCommand? просто делать insert.. либо, раз уж начал с квериком, UNIDIRECTIONAL=True (+CursorLocation на сервере)


 
Anatoly Podgoretsky ©   (2009-02-19 16:48) [10]

> Kinda  (19.02.2009 12:12:07)  [7]

А csv всегда больше реальных данных.


 
Petr V. Abramov ©   (2009-02-20 01:12) [11]


> Anatoly Podgoretsky ©   (19.02.09 16:48) [10]

csv и есть реальные данные, их можно посмотреть без sql и zip пр. умных слов :)


 
Программер   (2009-02-20 08:22) [12]


> Внего влезет не более 2Гб эсли аксесс не 2007и не более
> 4Гб в противном случае.П.С. Имортировать можно из csv или
> txt если по размеру пройдет

импорировал из csv 2007 аксесс грит более 2х гигов не могу импортировать :(


 
Программер   (2009-02-20 08:31) [13]


> я думаю, проще из Access приликоваться к ораклу и штатными
> средствами Access перелить

пытался, но переливается вся база, а мне нужен селект. незнаю как это сделать
> А почему-бы не использовать ADOCommand? просто делать insert.
> . либо, раз уж начал с квериком, UNIDIRECTIONAL=True (+CursorLocation
> на сервере)

попробую.
только сейчас думаю куда экспортировать, если эксель не большой обьем не поддерживает.
какой максимальный обьем эксель файла? если я сделаю на разных листах, в каждом листе по 65тыс записей, вместит ли он все 5 миллионов?


 
Программер   (2009-02-20 08:35) [14]


> только сейчас думаю куда экспортировать, если эксель не
> большой обьем не поддерживает.

хотел сказать не эксель а аксесс


 
Виталий Панасенко   (2009-02-20 08:56) [15]

если данных более 2 гиг... тут,кажись, даже MS SQL Express не поможет.у него, вроде, то ли 2, то ли 4 гига ограничение.. потому либо платные(либо....), либо FireBird/DB2/Oracle/Postgress/MySQL.. а там, может, еще какие варианты. DB2 и Oracle, кажись, не имеют ограничения на объем данных(я о бесплатных версиях Express).. на объем ОЗУ имеют. ЖарПтица бесплатна по определению, без каких-либо ограничений.


 
Sergey13 ©   (2009-02-20 09:31) [16]

> [15] Виталий Панасенко   (20.02.09 08:56)
> DB2 и Oracle, кажись, не имеют ограничения на объем данных(я о бесплатных версиях Express)..
Оракл имеет. 4 гига.


 
Anatoly Podgoretsky ©   (2009-02-20 13:06) [17]


> csv и есть реальные данные, их можно посмотреть без sql
> и zip пр. умных слов :)

Ничего подобного, csv кроме данных содержит и паразитную информацию, например кавычки и запятые.


 
Программер   (2009-02-26 06:48) [18]

Ситуация такая, из adoquery формирую запрос с cursorlocation на сервере, при попытки записать эти записи в эксель, выходит ошибка, "недостаточно памяти для обработки команды clsid{цифры}".
как обойти эту загвоздку? видимо он опять пытается грузить все записи в память?
я делаю такую логику
while adoquery not EOF do begin
пишем по строче в эксель;
next;
end;


 
Сергей М. ©   (2009-02-26 08:40) [19]


> пишем по строче в эксель;


Вот тут самое интересное)


 
sniknik ©   (2009-02-26 10:23) [20]

а куда делся "accseess" из вопроса?


 
Anatoly Podgoretsky ©   (2009-02-26 12:28) [21]

> Программер  (26.02.2009 6:48:18)  [18]

Какой еще сервер.


 
Программер   (2009-02-27 07:44) [22]


> > пишем по строче в эксель;Вот тут самое интересное)


procedure TForm3.SpeedButton2Click(Sender: TObject);
var
BeginCol, BeginRow,BeginRow2,beginrow3,j: integer;
RowCount, ColCount,NewListRowsCount,ReportNum: Integer;
tmp:ShortString;
begin
Duration := Now();
SpeedButton3.Enabled:=true;
SpeedButton3.Down:=false;
// запускаем Excel
ExcelApplication1.AutoConnect:=true;
// открываем книгу
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.OpenXML("C:\1.XLS",EmptyPar am));
// соединяемся с книгой
ExcelWorksheet1.ConnectTo(ExcelWorkbook1.ActiveSheet as ExcelWorksheet);

// Отключаем реакцию Excel на события, чтобы ускорить вывод информации
  ExcelApplication1.Application.EnableEvents := false;

ReportNum:=1;
NewListRowsCount:=OptionForm.ESBIntEdit1.AsInteger;
BeginCol := OptionForm.ESBIntEdit2.AsInteger;
BeginRow := OptionForm.ESBIntEdit3.AsInteger;
BeginRow2:=BeginRow;
ExcelWorksheet1.Name:="Отчет 1";
beginrow3:=1;

//  RowCount := ADOQuery1.RecordCount;
  ColCount := ADOQuery1.FieldDefs.Count;
//RzStatusPane2.Caption:="Строк: "+inttostr(RowCount);
RzStatusPane1.Caption:="Столбцов: "+inttostr(ColCount);

if OptionForm.CheckBox1.Checked=true then begin
                                  ExcelApplication1.Range[xlRCtoA1(BeginRow-1,BeginCol),EmptyParam].Interior.Color:=$00B5E7F4;
                                  ExcelApplication1.Range[xlRCtoA1(BeginRow-1,BeginCol),EmptyParam].Borders.Weight:=xlThin;
                                  end;
For J := 1 To ColCount Do begin
excelWorksheet1.Cells.Item[BeginRow-1,j+BeginCol]:=DBGrid1.Columns[j-1].Title.Caption;
ExcelApplication1.Range[xlRCtoA1(BeginRow-1,j+BeginCol),EmptyParam].Interior.Color:=$00B5E7F4;
ExcelApplication1.Range[xlRCtoA1(BeginRow-1,j+BeginCol),EmptyParam].Borders.Weight:=xlThin;
                         end;

  ADOQuery1.DisableControls;
  ADOQuery1.First;
  try
  while not ADOQuery1.Eof do begin

  //rows

                                  if BeginRow=NewListRowsCount then begin //ограничение здесь
                                     ExcelApplication1.Range["2:"+inttostr(ColCount),EmptyParam].Columns.AutoFit;
                                     ExcelApplication1.Range["1:"+inttostr(ColCount),EmptyParam].Columns.AutoFit;
                                     excelWorksheet1.ConnectTo(ExcelApplication1.ActiveWorkbook.Sheets.Add(EmptyParam ,ExcelApplication1.ActiveSheet,1,EmptyParam,LOCALE_USER_DEFAULT) as ExcelWorksheet);
                                     inc(ReportNum);
                                     ExcelWorksheet1.Name:="Отчет "+inttostr(ReportNum);
                                     BeginRow2:=BeginRow;
                                     if OptionForm.CheckBox1.Checked=true then begin
                                                                               ExcelApplication1.Range[xlRCtoA1(BeginRow-1,BeginCol),EmptyParam].Interior.Color:=$00B5E7F4;
                                                                               ExcelApplication1.Range[xlRCtoA1(BeginRow-1,BeginCol),EmptyParam].Borders.Weight:=xlThin;
                                                                               end;
                                     For J := 1 To ColCount Do begin
                                     excelWorksheet1.Cells.Item[BeginRow-1,j+BeginCol]:=DBGrid1.Columns[j-1].Title.Caption;
                                     ExcelApplication1.Range[xlRCtoA1(BeginRow-1,j+BeginCol),EmptyParam].Interior.Color:=$00B5E7F4;
                                     ExcelApplication1.Range[xlRCtoA1(BeginRow-1,j+BeginCol),EmptyParam].Borders.Weight:=xlThin;
                                                               end;
                                      NewListRowsCount:=NewListRowsCount+OptionForm.ESBIntEdit1.AsInteger;
                                                end;

                                  For J := 1 To ColCount Do begin  //columns
                                  ExcelWorksheet1.Cells.Item[BeginRow2,j+BeginCol]:=ADOQuery1.FieldbyName(ADOQuery1.FieldDefs.Items[j - 1].DisplayName).value;
                                  Application.ProcessMessages;
                                                            end;
                                  RzStatusPane3.Caption:=inttostr(BeginRow3);

                                  if OptionForm.CheckBox1.Checked=true then ExcelWorksheet1.Cells.Item[BeginRow2,BeginCol]:=inttostr(BeginRow3);
                                  if SpeedButton3.Down=true then exit;
                                  inc(BeginRow2);
                                  inc(beginrow3);
                                  ADOQuery1.Next;
                                  end;
  finally
ADOQuery1.EnableControls;
ExcelApplication1.Range["3:"+inttostr(ColCount),EmptyParam].Columns.AutoFit;
ExcelApplication1.Range["1:"+inttostr(ColCount),EmptyParam].Columns.AutoFit;

// делаем видимым Excel
ExcelApplication1.Visible[0]:=true;
SpeedButton3.Enabled:=true;
form3.Caption:="Duration : "+TimeToStr(Now() - Duration);
  end;

end;


форматировать не стал, скинул как есть.


 
Программер   (2009-02-27 07:45) [23]

упс.

procedure TForm3.SpeedButton2Click(Sender: TObject);
var
BeginCol, BeginRow,BeginRow2,beginrow3,j: integer;
RowCount, ColCount,NewListRowsCount,ReportNum: Integer;
tmp:ShortString;
begin
Duration := Now();
SpeedButton3.Enabled:=true;
SpeedButton3.Down:=false;
// запускаем Excel
ExcelApplication1.AutoConnect:=true;
// открываем книгу
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.OpenXML("C:\1.XLS",EmptyPar  am));
// соединяемся с книгой
ExcelWorksheet1.ConnectTo(ExcelWorkbook1.ActiveSheet as ExcelWorksheet);

// Отключаем реакцию Excel на события, чтобы ускорить вывод информации
 ExcelApplication1.Application.EnableEvents := false;

ReportNum:=1;
NewListRowsCount:=OptionForm.ESBIntEdit1.AsInteger;
BeginCol := OptionForm.ESBIntEdit2.AsInteger;
BeginRow := OptionForm.ESBIntEdit3.AsInteger;
BeginRow2:=BeginRow;
ExcelWorksheet1.Name:="Отчет 1";
beginrow3:=1;

//  RowCount := ADOQuery1.RecordCount;
 ColCount := ADOQuery1.FieldDefs.Count;
//RzStatusPane2.Caption:="Строк: "+inttostr(RowCount);
RzStatusPane1.Caption:="Столбцов: "+inttostr(ColCount);

if OptionForm.CheckBox1.Checked=true then begin
                                 ExcelApplication1.Range[xlRCtoA1(BeginRow-1,BeginCol),EmptyParam].Interior.Color:=$00B5E7F4;
                                 ExcelApplication1.Range[xlRCtoA1(BeginRow-1,BeginCol),EmptyParam].Borders.Weight:=xlThin;
                                 end;
For J := 1 To ColCount Do begin
excelWorksheet1.Cells.Item[BeginRow-1,j+BeginCol]:=DBGrid1.Columns[j-1].Title.Caption;
ExcelApplication1.Range[xlRCtoA1(BeginRow-1,j+BeginCol),EmptyParam].Interior.Color:=$00B5E7F4;
ExcelApplication1.Range[xlRCtoA1(BeginRow-1,j+BeginCol),EmptyParam].Borders.Weight:=xlThin;
                        end;

 ADOQuery1.DisableControls;
 ADOQuery1.First;
 try
 while not ADOQuery1.Eof do begin

 //rows

                                 if BeginRow=NewListRowsCount then begin //ограничение здесь
                                    ExcelApplication1.Range["2:"+inttostr(ColCount),EmptyParam].Columns.AutoFit;
                                    ExcelApplication1.Range["1:"+inttostr(ColCount),EmptyParam].Columns.AutoFit;
                                    excelWorksheet1.ConnectTo(ExcelApplication1.ActiveWorkbook.Sheets.Add(EmptyParam  ,ExcelApplication1.ActiveSheet,1,EmptyParam,LOCALE_USER_DEFAULT) as ExcelWorksheet);
                                    inc(ReportNum);
                                    ExcelWorksheet1.Name:="Отчет "+inttostr(ReportNum);
                                    BeginRow2:=BeginRow;
                                    if OptionForm.CheckBox1.Checked=true then begin
                                                                              ExcelApplication1.Range[xlRCtoA1(BeginRow-1,BeginCol),EmptyParam].Interior.Color:=$00B5E7F4;
                                                                              ExcelApplication1.Range[xlRCtoA1(BeginRow-1,BeginCol),EmptyParam].Borders.Weight:=xlThin;
                                                                              end;
                                    For J := 1 To ColCount Do begin
                                    excelWorksheet1.Cells.Item[BeginRow-1,j+BeginCol]:=DBGrid1.Columns[j-1].Title.Caption;
                                    ExcelApplication1.Range[xlRCtoA1(BeginRow-1,j+BeginCol),EmptyParam].Interior.Color:=$00B5E7F4;
                                    ExcelApplication1.Range[xlRCtoA1(BeginRow-1,j+BeginCol),EmptyParam].Borders.Weight:=xlThin;
                                                              end;
                                     NewListRowsCount:=NewListRowsCount+OptionForm.ESBIntEdit1.AsInteger;
                                               end;

                                 For J := 1 To ColCount Do begin  //columns
                                 ExcelWorksheet1.Cells.Item[BeginRow2,j+BeginCol]:=ADOQuery1.FieldbyName(ADOQuery1.FieldDefs.Items[j - 1].DisplayName).value;
                                 Application.ProcessMessages;
                                                           end;
                                 RzStatusPane3.Caption:=inttostr(BeginRow3);

                                 if OptionForm.CheckBox1.Checked=true then ExcelWorksheet1.Cells.Item[BeginRow2,BeginCol]:=inttostr(BeginRow3);
                                 if SpeedButton3.Down=true then exit;
                                 inc(BeginRow2);
                                 inc(beginrow3);
                                 ADOQuery1.Next;
                                 end;
 finally
ADOQuery1.EnableControls;
ExcelApplication1.Range["3:"+inttostr(ColCount),EmptyParam].Columns.AutoFit;
ExcelApplication1.Range["1:"+inttostr(ColCount),EmptyParam].Columns.AutoFit;

// делаем видимым Excel
ExcelApplication1.Visible[0]:=true;
SpeedButton3.Enabled:=true;
form3.Caption:="Duration : "+TimeToStr(Now() - Duration);
 end;

end;


 
Программер   (2009-02-27 07:46) [24]


> а куда делся "accseess" из вопроса?

можно  и в эксель...


 
Программер   (2009-02-27 07:50) [25]


> Anatoly Podgoretsky ©   (26.02.09 12:28) [21]
> > Программер  (26.02.2009 6:48:18)  [18]Какой еще сервер.
>

оракл


 
sniknik ©   (2009-02-27 08:05) [26]

> можно  и в эксель...
т.е. если груз предположительно может не влезть в грузовик то можно заменить его ведром...


 
Anatoly Podgoretsky ©   (2009-02-27 09:42) [27]

> Программер  (27.02.2009 7:50:25)  [25]

Эксель в Оракле, до чего дошла наука.


 
Программер   (2009-02-27 13:11) [28]


> > можно  и в эксель...т.е. если груз предположительно может
> не влезть в грузовик то можно заменить его ведром...

оказывается можно.
запихнул по миллиону записей в каждый лист. Excel 2007.
что интересно размер экселевского файла 350мб, dbf ника с теми же данными 3,6гб, акссес более 2х гигов.
Видимо хорошее сжатие реализовано в эксель. Ну а при открытии память заполняется на 2 гига.


 
Программер   (2009-02-27 13:13) [29]


> Anatoly Podgoretsky ©   (27.02.09 09:42) [27]
> > Программер  (27.02.2009 7:50:25)  [25]Эксель в Оракле,
>  до чего дошла наука.

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


 
Сергей М. ©   (2009-02-27 17:22) [30]


> Программер


Ну ты и нахреновертил однако)
Аж в глазах рябит)

Хорошо, а если выкинуть все пляски с бубном и оставить только пустой цикл

procedure TForm3.SpeedButton2Click(Sender: TObject);
begin
 ADOQuery1.First;
 while not ADOQuery1.Eof do
   ADOQuery1.Next;
end;

исключение возникает ?


 
Программер   (2009-03-02 11:18) [31]

нет не возникает.
мне кажется эксель через ком сервера такие большие обьемы не может правильно обрабатывать, зависоны начинаются на 12-30 тысячах строк.


 
Виталий Панасенко   (2009-03-02 11:29) [32]

Попробуй еще
ExcelApplication.Calculation[0] := xlManual до начала заполнения
и включить автопересчет в конце (xlAutomatic)


 
Сергей М. ©   (2009-03-03 12:03) [33]


> Программер   (02.03.09 11:18) [31]


Если тебе по барабану в какой контейнер экспортировать (судя по предыдущим твоим постам так оно и есть), экспортируй в обычный текстовый файл.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2010.03.07;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.008 c
9-1183152132
ElectriC
2007-06-30 01:22
2010.03.07
Мобильные игры


2-1262161972
pleasure
2009-12-30 11:32
2010.03.07
формы, права, доступ


2-1261572735
Shamansky
2009-12-23 15:52
2010.03.07
Access 2007 vs Delphi 2007


6-1210590992
little_fish
2008-05-12 15:16
2010.03.07
проблема с Web-Services(HTTPRIO)


10-1164542794
vlad-mal
2006-11-26 15:06
2010.03.07
Утечка памяти (объекты TConnectionPoints/TConnectionPoint )





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский