Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 29.01.2013
Сообщений: 75
1

Сохранить список строк в поток

30.10.2015, 21:07. Просмотров 703. Ответов 18
Метки нет (Все метки)

Не знаю как решить такую задачу:

Есть список строк, и к каждой его строке "прицеплена" запись, через свойство Objects.
Когда я сохраняю список в поток (SaveToStream), его строки сохраняются в потоке, а вот
прицепленные к строкам объекты - нет.
Как сделать, чтобы они тоже сохранялись и считывались?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.10.2015, 21:07
Ответы с готовыми решениями:

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

Как Excel документ, в котором 10000 строк, разбить по 10 строк и сохранить каждые 10 строк в отдельный файл
Здравствуйте. Подскажите как Excel документ в котором 10000 строк разбить по 10 строк и сохранить...

Сохранить BMP в поток
Доброго вечера Всем! Пытаюсь сохранить изображение контрола Bitmap btGraphs = new...

Сохранить медиа-поток в файл
Я принимаю медиа-поток MPEG2-TS по UDP, вот код #include <iostream> #include <stdio.h> #include...

18
2645 / 2268 / 278
Регистрация: 24.12.2010
Сообщений: 13,725
30.10.2015, 21:11 2
Цитата Сообщение от AHTOIIIKA Посмотреть сообщение
"прицеплена" запись,
Цитата Сообщение от AHTOIIIKA Посмотреть сообщение
прицепленные к строкам объекты
Ты уже определись что там у тебя прицепелено)
Запись и объект некоторым образом все же различаются ..
От этого и решение напрямую зависит ..
0
251 / 162 / 24
Регистрация: 22.08.2014
Сообщений: 1,597
Записей в блоге: 1
30.10.2015, 22:01 3
Код давай?
0
Нарушитель
4601 / 2492 / 566
Регистрация: 12.03.2015
Сообщений: 12,243
31.10.2015, 02:36 4
Цитата Сообщение от AHTOIIIKA Посмотреть сообщение
к каждой его строке "прицеплена" запись, через свойство Objects
описание типа required.
а с какой целью пихать енто в стрим?
0
0 / 0 / 0
Регистрация: 29.01.2013
Сообщений: 75
31.10.2015, 18:04  [ТС] 5
Delphi
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
type
  TWordMaps = class(TObject)
    VerseMap: TxIntegerList;
    QuestMap: TxIntegerList;
  public
    constructor Create();
    destructor Destroy(); override;
  end;
 
var
    slWordMaps: TStringList;  // хранит карты стихов и вопросов для искомых слов
    slQuestMaps: TStringList; // хранит карты стихов для каждого вопроса
 
procedure GetAllMaps;
var
  StreamV, StreamQ: TStream;
  iPos: Integer;
begin
    with DSWords do begin
      First;
      while not Eof do begin
        StreamV := CreateBlobStream(FieldByName('VERSE_MAP'), bmRead);
        StreamQ := CreateBlobStream(FieldByName('QUEST_MAP'), bmRead);
        iPos := slWordMaps.AddObject(FieldByName('WORD_NAME').AsString, TWordMaps.Create);
        (slWordMaps.Objects[iPos] as TWordMaps).VerseMap.LoadFromStream(StreamV);
        (slWordMaps.Objects[iPos] as TWordMaps).QuestMap.LoadFromStream(StreamQ);
        Next;
      end;
    end; {with}
    with DSQuest do begin
      First;
      while not Eof do begin
        StreamQ := CreateBlobStream(FieldByName('QVERSE_MAP'), bmRead);
        iPos := slQuestMaps.AddObject(FieldByName('QUEST_NUM').AsString, TxIntegerList.Create);
        (slQuestMaps.Objects[iPos] as TxIntegerList).Sorted := True;
        (slQuestMaps.Objects[iPos] as TxIntegerList).Duplicates := dupIgnore;
        (slQuestMaps.Objects[iPos] as TxIntegerList).LoadFromStream(StreamQ);
        Next;
      end;
    end; {with}
    StreamV.Free; StreamQ.Free;
    DSWords.Close; DSQuest.Close;
end;
DSWords и DSQuest - это DataSet-ы, прицепленные к таблицам в БД. В них хранятся данные, в BLOB полях,
которые в итоге должны оказаться в свойстве Objects каждой записи списков slWordMaps и slQuestMaps.

Сложно я наверно объясняю... Просто дело вот в чём - при загрузке моей программы - когда показанные выше циклы работают, загрузка заметно замедляется, поскольку в этих таблицах около 100000 записей.
И я подумал, может быть получится убыстрить загрузку, сохранив заранее оба уже готовых (то есть считанных из БД) списка slWordMaps и slQuestMaps в файловые потоки, а при загрузке - считав их...
0
251 / 162 / 24
Регистрация: 22.08.2014
Сообщений: 1,597
Записей в блоге: 1
31.10.2015, 18:21 6
А зачем ты их постоянно загружаешь из файла?
0
3392 / 2924 / 790
Регистрация: 29.08.2013
Сообщений: 19,628
Записей в блоге: 1
31.10.2015, 18:24 7
AHTOIIIKA, а вам надо заполнить получить все 100000 строк при загрузке?

предлагаю
1. сделать прогрессбар и загружать по 1000 в цикле и отрисовывать пользователю %
2. использовать OTL - там легко организовать 2 параллельных потока, правда они тоже будут долго работать.
0
0 / 0 / 0
Регистрация: 29.01.2013
Сообщений: 75
31.10.2015, 19:13  [ТС] 8
Прогресс бар у меня есть... Правда он настолько тормозит, что лучше вообще без него...
А заполняю я эти 2 списка при каждой загрузке для того, чтобы получить потом уже скорость работы программы (это поисковая программа) засчёт того, что всё берётся из оперативной памяти.
Я пробовал делать через язык SQL, но получил гораздо более медленный результат поиска, поэтому написал всё сам на Дельфи.
0
3392 / 2924 / 790
Регистрация: 29.08.2013
Сообщений: 19,628
Записей в блоге: 1
31.10.2015, 19:23 9
AHTOIIIKA, так они еще и в памяти висят эти датасеты?

сама БД у вас какая и где находится? на сервере или локально?
индексы в БД есть? какие и как устроены?
0
2645 / 2268 / 278
Регистрация: 24.12.2010
Сообщений: 13,725
31.10.2015, 19:26 10
Начни с объявления и реализации методов TWordMaps.LoadFromStream/SaveToStream
0
0 / 0 / 0
Регистрация: 29.01.2013
Сообщений: 75
31.10.2015, 19:27  [ТС] 11
Я в том коде, который первоначально привёл, после считывания данных в строковые списки - оба датасета закрываю. Этого недостаточно, они что после этого продолжают висеть в памяти?

БД - локальная Firebird. Проиндексированы все поля, кроме длинных текстовых.
0
251 / 162 / 24
Регистрация: 22.08.2014
Сообщений: 1,597
Записей в блоге: 1
31.10.2015, 19:44 12
Ну так и храни нужные поля в других DataSet-ах.
0
0 / 0 / 0
Регистрация: 29.01.2013
Сообщений: 75
31.10.2015, 19:56  [ТС] 13
В смысле?? Датасеты ничего неумеют хранить. Они же ведь только отображают таблицу или запрос из БД...
0
3392 / 2924 / 790
Регистрация: 29.08.2013
Сообщений: 19,628
Записей в блоге: 1
31.10.2015, 20:00 14
ничего не понятно
если бы ТС хранил таблицы в Memtable то было бы понятно - запросы шли бы быстрее

TC, а обычный запрос очень долго выполняется?
как вы его делаете? выводите все 100000 строк через SELECT и в цикле обрабатываете?
0
0 / 0 / 0
Регистрация: 29.01.2013
Сообщений: 75
31.10.2015, 20:15  [ТС] 15
Какой "обычный запрос"? Можно поконкретнее вопрос ваш?
0
3392 / 2924 / 790
Регистрация: 29.08.2013
Сообщений: 19,628
Записей в блоге: 1
31.10.2015, 20:23 16
вы писали
Я пробовал делать через язык SQL, но получил гораздо более медленный результат поиска
вот я и спрашиваю что это был за запрос и как вы обрабатывали его результат
0
0 / 0 / 0
Регистрация: 29.01.2013
Сообщений: 75
31.10.2015, 20:35  [ТС] 17
это долгая история... я не смогу рассказать, и не относится к моему затруднению, из-за которого я написал на форум.
Скажу только что я очень долго экспериментировал с SQL прежде чем написать всё руками. Но SQL в моём случае Запросы обрабатывались медленнее гораздо, раз в 10, от того что я получил через Delphi.
0
qwertehok
31.10.2015, 20:43
  #18

Не по теме:

как админ БД я уверен что все можно сделать в SQL если правильно поставить задачу
:)

0
0 / 0 / 0
Регистрация: 29.01.2013
Сообщений: 75
31.10.2015, 21:02  [ТС] 19
ну может я не смог на SQL... Стояла задача поиска в серии книг, где содержится несколько сотен тысяч предложений и используется около 100 000 слов. Поиск как в интернете - то есть вводишь несколько слов, которые должны оказаться в предложении вместе. Программа для каждого слова находит все его имеющиеся падежи, склонения и т.п. и учитывает в поиске всех его "родственников". Количество искомых слов в запросе может таким образом доходить до нескольких сотен.
И это только часть задачи... При поиске нужно было соблюдать такие хитрые условия, что когда я пробовал на форумах спрашивать как написать такой SQL запрос, мне не смогли помочь...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.10.2015, 21:02

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

С# Сохранить класс в поток и прочитать его
Я подумал будет удобно записать класс в какой-нибудь массив байтов, отправить его по сети, а уже...

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

FB2.5 может ли сохранить поток во внейшний файл?
Здравствуйте! Подскажите - можно ли написать ХП или ещё каким-то образом сделать, чтобы FB2.5...

Сохранить, восстановить данные при повороте (Фрагмент, Поток)
Помогите разобраться как сделать правильно поворот экрана. Есть МаинАктивити в которой создается...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.