Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.03.07;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.017 c
6-1210590992
little_fish
2008-05-12 15:16
2010.03.07
проблема с Web-Services(HTTPRIO)


15-1261101984
Kerk
2009-12-18 05:06
2010.03.07
«Лучший свободный проект России»


15-1261220394
@!!ex
2009-12-19 13:59
2010.03.07
Где прочитать отзывы про WiMax оборудование?


15-1257258721
Romkin
2009-11-03 17:32
2010.03.07
Конкурс на Исходниках. С призами


2-1262073913
oleg1963
2009-12-29 11:05
2010.03.07
Добавить компонент в класс. Получилось.