Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.03.2017, 19:28
Pcrepair Pcrepair вне форума
Новичок
 
Регистрация: 20.01.2015
Сообщения: 52
Версия Delphi: Pascal
Репутация: 10
По умолчанию Хранение графических файлов (jpeg) в переменной

Добрый день. Есть следующая ситуация :
- программа по УРЛ загружает множество картинок с сайтов записывает их в указанный каталог на ЖД под своими собственными именами. все очень наглядно, можно просмотреть, если нужно, картинки
- на текущем этапе уже не нужно просматривать картинки, и значит не нужно записывать их на ЖД. лучше сразу в ГлобПерем.

Вопрос : какого типа нужно использовать переменную, учитывая что :
- файлы графические(бинарные?)
- размер файла от 1 до 1000 кб
- число файлов - тысячи
- общий объем загрузки может состовлять ?сотни мегабайт
- желательно чтобы метод был универсальный(веб-страницы то же чтоб можно было сохранять)
- не было потенциальной возможности сбоя(из за типа переменной) при хранении данных в ОЗУ
Ответить с цитированием
  #2  
Старый 05.03.2017, 20:09
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Хранить файлы в переменных невозможно. Переменная хранит обычно от 1 до 4 байт.
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 05.03.2017 в 20:14.
Ответить с цитированием
  #3  
Старый 05.03.2017, 20:53
Pcrepair Pcrepair вне форума
Новичок
 
Регистрация: 20.01.2015
Сообщения: 52
Версия Delphi: Pascal
Репутация: 10
По умолчанию

TStringList ну пускай объект-класс. не надо придираться по мелочам
Ответить с цитированием
  #4  
Старый 05.03.2017, 21:02
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

А почему не TList<TJPEGImage> ?
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 06.03.2017, 07:07
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Pcrepair
...на текущем этапе уже не нужно просматривать картинки, и значит не нужно записывать их на ЖД. лучше сразу в ГлобПерем...
Но скачивать картинки по ссылке всёравно придётся, ведь что смотреть, что в "ГлобПерем" заносить, нужен набор байтов для этого. А можно сделать так
Код:
uses UrlMon;
procedure TForm1.Button1Click(Sender: TObject);
var
 URLfile, Fname: string;
begin
 // "УРЛ...картинки"
 URLfile:= 'http://kaifolog.ru/uploads/posts/2011-10/1319535258_002.jpg';

 // "указанный каталог"
 Fname:= ExtractFilePath(ParamStr(0)) +

         // "под своими собственными именами"
         Copy(URLfile,LastDelimiter('/',URLfile)+1,Length(URLfile));

 // "можно просмотреть...картинки" если уже есть на диске
 if FileExists(Fname) then Image1.Picture.LoadFromFile(Fname)
   else

    // или "записывает их в указанный каталог на ЖД"
    UrlDownloadToFile(nil,PAnsiChar(URLfile),PAnsiChar(Fname),0,nil);
end;
Ответить с цитированием
  #6  
Старый 06.03.2017, 18:49
Pcrepair Pcrepair вне форума
Новичок
 
Регистрация: 20.01.2015
Сообщения: 52
Версия Delphi: Pascal
Репутация: 10
По умолчанию

Alegun, спасибо за внимание, но
Цитата:
- программа по УРЛ загружает множество картинок с сайтов записывает их в указанный каталог на ЖД под своими собственными именами. все очень наглядно, можно просмотреть, если нужно, картинки
это уже сделано, давно, работает

еще раз, прям сейчас :
- многопоточные загрузчики, под управление диспетчера потоков, грузят в указанный каталог на ЖД графические файлы разных типов и размеров
- по окончании загрузки имена файлов записываются в список ТСтрингЛист
- в цикле ДЛЯ файлы вызываются по имени и анализируются по указанным параметрам (размер файла, тип файла, ширина-высота файла) и ИМЕНА файлов сортируются в списке по правилам
- файл с первым именем в списке(с самым большим индексом) вызывается, обрабатывается и сохраняется в другом каталоге с другим именем
- в первом каталоге все файлы удаляются
Следующий цикл загрузки картинок, и так тыщи циклов

мне не нравится первый пункт, запись файлов на ЖД. оно совершенно не нужно. вопрос в какой потомок ТСтрингс(или куда еще) и как записать множество самых разных типов файлов. но только не надо догадки тут постить. если нет реального опыта, писать не надо.
Ответить с цитированием
  #7  
Старый 06.03.2017, 19:36
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Например, сохранять не в файл, а в TMemoryStream. Только тип файла надо хранить где-нибудь в другом месте.
Ответить с цитированием
  #8  
Старый 06.03.2017, 20:39
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,029
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну а классы и дженерики тебе нафига даны.
Код:
interface 

type
  TMemDataType = (mdtJpeg, mdtHtml);

  TMemData = class
  private
    FDataType : TMemDataType;
    FData : TStream;
  public
    constructor Create(ADataType : TDataType; AData : TStream);
    property DataType : TDataType read FDataType;
    property Data : TStream read FData;
  end;

  // Если нужно что-то специфичное, то "рожаем" наследников
  TJpegMemData = class(TMemData)
  private
    FWidth : Integer;
    FHeight : Integer;
  public
    constructor Create(AData : TStream; AWidth, AHeight : Integer);
    property Width : Integer read FWidth;
    property Height : Integer read FHeight;
  end;

// А тут список для хранения всего этого счастья
var
  LoadedData : TObjectList<TMemData>;

implementation
  
constructor TMemData.Create(ADataType : TDataType; AData : TStream);
begin
  inherited;
  FDataType := ADataType;
  FData := AData;
end;

constructor TJpegMemData.Create(AData : TStream; AWidth, AHeight : Integer);
begin
  inherited Create(mdtJpeg,AData);
  FWidth := AWidth;
  FHeight := AHeight;
end;

// Создание и удаление глобального списка
initialization
  LoadedData := TObjectList<TMemData>.Create;

finallization
  FreeAndNil(LoadedData);

end.

Как то так.
Только не забыть при работе со списком обеспечить потокозащищенность.

ЗЫ. А вообще зачем хранить все в памяти, если потом идет обработка и удаление лишнего и сохранение только полезного. Может проще просто прямо в потоке проанализировать и не сохранять ничего лишнего?
Ответить с цитированием
  #9  
Старый 07.03.2017, 06:58
Pcrepair Pcrepair вне форума
Новичок
 
Регистрация: 20.01.2015
Сообщения: 52
Версия Delphi: Pascal
Репутация: 10
По умолчанию

Цитата:
ЗЫ. А вообще зачем хранить все в памяти, если потом идет обработка и удаление лишнего и сохранение только полезного. Может проще просто прямо в потоке проанализировать и не сохранять ничего лишнего?

Наверно потому что загрузка картинок многопоточная и ассинхронная. вначале нужно загрузить ВСЕ картинки и только потом их анализировать. вот именно для этого их нужно где то хранить. пока на ЖД. но чтобы не пилить ЖД(и ССД тоже не любят лишние циклы записи) и нужно НАКАПЛИВАТЬ граф.файлы в ОЗУ.

ну теперь то уже все понятно?
Ответить с цитированием
  #10  
Старый 06.03.2017, 20:27
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Pcrepair
...вопрос в какой потомок ТСтрингс(или куда еще) и как записать множество самых разных типов файлов. но только не надо догадки тут постить. если нет реального опыта, писать не надо.
В ТСтрингс без прикручивания TObject файлы записать нельзя, формат немного не тот у носителя, тексту - текстово. Догадки пошли, они и не нужны, сами файлы, только инфа "размер файла, тип файла, ширина-высота файла". Без догадок, у меня анализатор капчи вбирает картинки посредством апишной функции URLOpenBlockingStream() в массив типа array of IStream, после конвертации TOLEStream > TMemoryStream откуда нормально грузятся в битмап пикчи имиджа через .LoadFromStream(), но есть ещё URLOpenStream и URLOpenPullStream
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:04.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter