powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / substring BLOBа медленно
20 сообщений из 45, страница 2 из 2
substring BLOBа медленно
    #39923367
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery,

дома повторю. Если кому-то интересно могу выложить код процедуры на github.

Ничего удивительного в этом нет. В моей процедуре BLOB читается однократно (сразу все сегменты) в stream. Дальше я из stream получаю строку, а потом собственно разделяю на подстроки, каждая подстрока возвращается аналогом SUSPEND.

Я делал подобную процедуру и на Delphi, но там скорость была почти в 2 раза меньше. Видимо дорого преобразование string <-> ansichar[N]
...
Рейтинг: 0 / 0
substring BLOBа медленно
    #39923374
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
В моей процедуре BLOB читается однократно (сразу все сегменты) в stream. Дальше я из stream получаю строку, а потом собственно разделяю на подстроки, каждая подстрока возвращается аналогом SUSPEND.
Это требует много памяти.
Не пробовал читать блоб частями ?
...
Рейтинг: 0 / 0
substring BLOBа медленно
    #39923418
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

была мысль обрабатывать обрабатывать частями по 32K. Помимо экономии памяти можно получить профит в виде досрочного прерывания всякими first/rows, так чтобы блоб не читался до конца
...
Рейтинг: 0 / 0
substring BLOBа медленно
    #39923527
demon1992
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис
WildSery,

дома повторю. Если кому-то интересно могу выложить код процедуры на github.


Было бы интересно.
...
Рейтинг: 0 / 0
substring BLOBа медленно
    #39923664
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery,

а вот теперь list_to_rows на том же самом компьютере и БД

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
План
PLAN JOIN (HASH (LST R RDB$DATABASE NATURAL, , LST R RDB$DATABASE NATURAL, ), S NATURAL)

------ Информация о производительности ------
Время подготовки запроса = 16ms
Время выполнения запроса = 10s 359ms
Среднее время на получение одной записи = 10 359,00 ms
Current memory = 280 864 576
Max memory = 281 217 456
Memory buffers = 16 384
Reads from disk to cache = 0
Writes from cache to disk = 1 127
Чтений из кэша = 81 387
...
Рейтинг: 0 / 0
substring BLOBа медленно
    #39923673
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Лучше в виде статьи. Пусть даже самой простенькой.
...
Рейтинг: 0 / 0
substring BLOBа медленно
    #39923684
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F,

дык писал уже, но не по плюсы

https://habr.com/ru/post/455375/
https://github.com/sim1984/udr-book
...
Рейтинг: 0 / 0
substring BLOBа медленно
    #39923701
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Теперь про плюсы. Пора уже их пропагандировать.)))
...
Рейтинг: 0 / 0
substring BLOBа медленно
    #39923721
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис

------ Информация о производительности ------
...
Current memory = 280 864 576
Max memory = 281 217 456
Memory buffers = 16 384
Reads from disk to cache = 0
Writes from cache to disk = 1 127
Чтений из кэша = 81 387


Кстати, кто даст внятный, но лаконичный перевод вот этого вот всего на русский, чтобы я забил в локализацию эксперта?
Например, Current/max memory - это что и в чем?
Reads\writes - это, я так понимаю, в страницах.
...
Рейтинг: 0 / 0
substring BLOBа медленно
    #39923734
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторКстати, кто даст внятный, но лаконичный перевод вот этого вот всего на русский, чтобы я забил в локализацию эксперта?
а оно действительно надо?
...
Рейтинг: 0 / 0
substring BLOBа медленно
    #39923758
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpertНапример, Current/max memory - это что и в чем?

в байтах конечно же. Главное не перевести Current как "текущая", а то стрёмно будет
...
Рейтинг: 0 / 0
substring BLOBа медленно
    #39923763
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
а вот теперь list_to_rows на том же самом компьютере и БД
Спасибо.

ЗЫ. Надеюсь, это "Fetch All" для обоих замеров? Уточню, на всякий случай.
...
Рейтинг: 0 / 0
substring BLOBа медленно
    #39923765
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery,

я же специально агрегатами min/max обвернул, чтобы там ровно 1 запись возвращалась
...
Рейтинг: 0 / 0
substring BLOBа медленно
    #39923767
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

А. Это я ещё кофе не выпил.
...
Рейтинг: 0 / 0
substring BLOBа медленно
    #39924250
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladЭто требует много памяти.
Не пробовал читать блоб частями ?

попробовал.
Очень долго ломал голову, пока не вспомнил, что LIST очень забавно сегментирует блоб.
Я то наивно полагал, что прочитаю через getSegment столько байт сколько указываю.
Вроде была идея сделать так чтобы LIST возвращал потоковый блоб или передумали?
...
Рейтинг: 0 / 0
substring BLOBа медленно
    #39924286
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
substring BLOBа медленно
    #39924434
demon1992
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,
Благодарю.
...
Рейтинг: 0 / 0
substring BLOBа медленно
    #39927351
zeon11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Накидал в Lazarus функцию для клиента, может кому пригодится :

Код: 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.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
......
uses
  Classes, SysUtils, StrUtils, Forms, Dialogs, LConvEncoding, ComCtrls;

type
    TInsertXMLFunc = function(AXMLCut: AnsiString; var ANameFunction: String): boolean;
.....................................

class function TFileOMS.XMLChopper(AFile_Name:String; ATeg: AnsiString; AInsertXMLFunc: TInsertXMLFunc; AProgressBar: TProgressBar): integer;
var   CH : AnsiChar;  NameFunc: String;
      FText      : TFileStream;
      Length1, Length2 : integer;
      Teg1, Teg2, Value1, Value2, XMLCut: AnsiString;
begin
 Result:=0;
 try   //  ATeg:='PERS';
  Teg1:=ATeg+'>';  //  PERS>
  Teg2:='/'+Teg1; // /PERS>
  Length1:=Length(Teg1); //  5
  Length2:=Length(Teg2); //  6
  SetLength(Value1, Length1);
  SetLength(Value2, Length2);
  AProgressBar.Position:=0;
  FText:=TFileStream.Create(AFile_Name,fmShareDenyNone);   //открываем файл
  AProgressBar.Max:=FText.Size;
  FText.Seek(0,soFromBeginning);    //переходим в начало
  repeat
      FText.Read(CH,1);
      if (CH='<') then
        begin
           FText.ReadBuffer(Pointer(Value1)^, Length1);
           if Value1=Teg1   //   'PERS>'
             then begin
                    XMLCut:='<'+Teg1;   //  '<PERS>'
                    repeat
                        FText.Read(CH,1);
                        XMLCut:=XMLCut+CH;
                        if (CH='<') then
                           begin
                              FText.ReadBuffer(Pointer(Value2)^, Length2);
                              XMLCut:=XMLCut+Value2;
                              if Value2=Teg2  //   '/PERS>'
                                 then begin
                                       AProgressBar.Position:=FText.Position;
                                       if (not AInsertXMLFunc(XMLCut, NameFunc))
                                          then begin
                                                 XMLCut:=CP1251ToUTF8(XMLCut);
                                                 ShowMessage('В функции '+NameFunc+ ' неудачная вставка блока: '+ XMLCut);
                                                 exit;
                                               end;
                                        inc(Result);
                                        break;
                                      end
                           end;
                    until FText.Position>=FText.Size;
                  end;
        end;
  until FText.Position>=FText.Size;
 finally
     FreeAndNil(FText);
 end;
end;



Использование функции
Код: 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.
function InsertXML_PERS_IntoFB(AXMLCut: String; var ANameFunction: String): boolean;
begin
   Result:=False;
   ANameFunction:='Добавление песональных данных в FB';
 //  Form_Main.SPxmlInsertZAP.ParamByName('XML_BODY_PERS').AsString:=CP1251ToUTF8(AXMLCut);   -- или
   Form_Main.SPxmlInsertZAP.ParamByName('XML_BODY_PERS').AsString:=AXMLCut;
   Form_Main.SPxmlInsertZAP.ExecSQL;
   Result:=true;
end;

procedure TForm_Main. .......................... ;
var InsertRecord: Integer;
begin
 try
......
      InsertRecord:=TFileOMS.XMLChopper(TmpDir+AFileOMS.NamePasp, 'PERS', @InsertXML_PERS_IntoFB, ProgressBar1);
  //    InsertRecord:=TFileOMS.XMLChopper(TmpDir+AFileOMS.NameMed, 'ZAP', @InsertXML_ZAP_IntoFB, ProgressBar1);

...................
      Memo1.Lines.Add('                Загружено в БД записей: '      +IntToStr(InsertRecord) );

 finally
     //
 end;

end;    



файл на 77 мб (42 785 записей) грузится в БД 10 мин

Клиентская машина - ноутбук, win 10, памяти 12гб, Core i7 4700HQ, 2.40GHz, про сервер писал выше.
Конечно, в процедуре-чоппере есть "вода", можно кое-что и выкинуть, но, думаю, радикально это скорость не повысит.
...
Рейтинг: 0 / 0
substring BLOBа медленно
    #39927358
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zeon11,

поищи готовый SAX parser для XML. Он как раз для случаев когда XML реально большой, чтобы не загружать всё дерево DOM в память.
...
Рейтинг: 0 / 0
substring BLOBа медленно
    #39927489
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zeon11

файл на 77 мб (42 785 записей) грузится в БД 10 мин

Читать по байту из файлстрима - не очень хорошая идея. Ну и там дальше много всего можно поулучшать
...
Рейтинг: 0 / 0
20 сообщений из 45, страница 2 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / substring BLOBа медленно
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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