Форум: "Базы";
Текущий архив: 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.006 c