Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/26: Рейтинг темы: голосов - 26, средняя оценка - 4.62
1 / 1 / 0
Регистрация: 29.06.2015
Сообщений: 134
RAD XE3+

Где лучше хранить большую текстовую базу?

09.09.2023, 10:35. Показов 6360. Ответов 86

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Столкнулся с проблемой.
У меня есть база в Memo1 -занимает 100 000 строк.

Ищет в случае обращения поиском по данному мемо если всё хранить в нёпочемуто долго, а если рядом созраняю с прогой текстовый файл и ищу по нему то тоже долго, есть ли какойто быстрый вариант для работы с бальшими базами данных именно в Delphi?

Спасибо за ответ(ы).

С уважением, Денис.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.09.2023, 10:35
Ответы с готовыми решениями:

Где лучше хранить данные
Проблема вот в чем. Один знакомый попросил написать для него прогу для составление и хранение данных о своей семье в виде генеологического...

Где лучше хранить 100-500 записей
Доброго времени суток! Столкнулся с таким вопросом: в программе храню настройки в ini - файле. Теперь необходимо сделать возможность...

Где лучше всего хранить базу данных больших размеров ?
Всем привет! Подскажите пожалуйста где лучше всего хранить базу данных больших размеров порядка 50 - 70 GB. ? С помощью MySQL или MS SQL...

86
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
18.09.2023, 17:37
Студворк — интернет-сервис помощи студентам
Json в первую очередь это промежуточный формат обмена данными между СУБД, а это приводит к очевидному выводу, что для полноценного использования этих данных вам нужна СУБД, тем более это необходимо, когда речь идет о быстром получении информации по разным критериям и выводе результата на экран. Никакой поиск по тексту, даже с использование регулярных выражений, не даст вам выборку нужной информации. О предоставлении выборки в заданном порядке, да еще с учетом дополнительных поисковых критериев вообще речи не идет. Вывод очевиден, нужна СУБД, осталось определится, какая именно вам лучше подойдет. Я бы остановил свой выбор на SqLite, т.к. для ее работы вам вообще ничего дополнительно устанавливать не потребуется, да и объем данных в 100 тыс строк для этой БД - мелочь.
3
1 / 1 / 0
Регистрация: 29.06.2015
Сообщений: 134
18.09.2023, 18:13  [ТС]
Благословенного всем дня!

Json в первую очередь это промежуточный формат обмена данными между СУБД...
Безумно приятно получать ответ/рекомендацию от мудрого и хладнокровного, не указывающего на недостаток в знаниях человека. Спасибо гос-н Пытливый.
--------------------------------------------
Если Вас, и любого кто готов наполнять Наш лучший форум Рунета хорошими знаниями, не затруднит подискутировать в рамках данной темы, подскажите пожалуйста, последовательность действий, создания базы данных SQL (теперь это просьба помощи), для добавления и максимально быстрого поиска (в цикле я всё подключу сам, но добавлению компонентов и работе с ними хотелось бы научиться).

Итак:
1. Есть File.txt в котором находятся 100 000 строк.
2. Надо найти строку в которой есть слово "Москва".

3. Какие компоненты надо добавить для размещения базы?
3.1 Где разместить базу для взаимодействия с ней?
4. Как должен правильно быть добавлен SQL запрос в кнопку?

Если Вас не затруднит помогите мне и одновременно помогая мне, давайте создадим короткую, но последовательную методичку/туториал для будущих поколений, как мудро и грамотно это не раз делал легендарный госп-н Крапоткин.

С уважением, Денис.
0
 Аватар для Beltar
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,662
18.09.2023, 19:25
В базе есть индексация и механизмы разделения доступа и контроль целостности.

По работе с БД есть куча книг. Как, впрочем, и нюансов, которых в книгах не будет.

А вообще я так и не понял, что это за данные, как они выбираются, и как записываются.

Лет 10 назад у нас поставили на заводе новые вулканизаторы двух типов. Ну а поскольку купить оборудование на сотни миллионов, но не заказать копеечный автоматический сбор с них данных, это по нашему, то съем данных для технологов флешкой в виде txt-файлов был. Там на одной модели, период записи был 1 секунда, как вы будете строить график работы за 1 8-часовую смену в том же Excel при таких объемах данных, я ХЗ. Никак. И запаритесь выбирать, и Excel просто сдохнет такой график из сотен тысяч точек рисовать. Я сделал архивацию в БД, тем более серверная база всем доступна. А потом тетки додумались, что зачем все вносить, когда можно текстовые файлы хранить, они же графики смотрят только если проблемы были, и просто вносить перестали. Только если надо, занесут. Я в итоге плюнул, сделал им просто открытие этих файлов без заноса в БД. И их это устраивает, просто складировать десятки гигабайт текстовых файлов, открывая только нужные. По, идее, может сдохнуть диск, на котором это дело лежит, это как минимум, т. е. требование надежности не выполняется. Но им пофиг, да и эту проблему обходили еще во времена бумажных самописцев.

Так что я ХЗ, возможно, в вашем случае можно обойтись текстовым файлом, а, возможно, там есть смысл сделать нормальную БД с разбиением по науке и справочными таблицами. Для умеющего работать с БД это вообще всегда проще, т. к. работа стандартная.
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
18.09.2023, 19:56
если я все верно понял, на входе - json файл - массив из 100500 одинаковых объектов
задача

1. загрузить файл в JSON - парсер
2. приготовить БД и в ней таблицу ровно такой же структуры и в цикле загрузить одно в другое
возможно нам нужно будет еще доп поле - типа номер загруженного файла, или его имя, или еще что-то, чтобы проводить загрузку нескольких файлов

первый пункт вам должен вроде уже быть понятен
второй - не так прост, чтоб его в двух абзацах разъяснить
нужно как минимум понимать как работают базы данных

можно использовать SQLite, как самую простую
и с помощью компонентов FireDac сделать все что нужно

вот например видео как JSON разбирают и суют в виртуальную таблицу в памяти. тут JSON правда с сервера получают, но это в нашем случае лишнее.
https://www.youtube.com/watch?v=zDts1DgVbnU

а вот - как работают вообще с FireDac
https://www.youtube.com/watch?v=iW644fKdFic
(возможно на российском канале есть русскоязычная версия)

вот собсно и вариант - соединить эти два процесса - загрузить не в виртуальную таблицу - а в настоящую
(но для этого надо ее создать)
например с помощью
https://sqlitebrowser.org/
1
 Аватар для Beltar
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,662
18.09.2023, 20:10
Насчет пакетной вставки через FireDAC, я какое-то время назад с удивлением нарвался на баг с TFDQuery.SQL, в отличие от обычного TStringList время добавления новых строчек в SQL было не линейным, а почти идеально квадратичным. В какой версии это появилось, не знаю, но в 11.2 есть. Пришлось обходить пачками штук по 50.

Если надо дописывать с опред места в файле, который кем-то постоянно дописывается, то просто запомнить макс. Id в базе и только от него брать.
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
18.09.2023, 22:51
Цитата Сообщение от Beltar Посмотреть сообщение
почти идеально квадратичным
точно ни к чему визуальному не был подсоединен компонент?
уж больно похожие симптомы
0
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
19.09.2023, 00:35
Цитата Сообщение от Ltybcrf Посмотреть сообщение
подскажите пожалуйста, последовательность действий, создания базы данных SQL
Я не увидел какую именно БД вы хотите использовать? Предположу, что вы остановились на SqLite.
Создать базу SqLite и импортировать в нее данные можно средствами Delphi, но настоятельно рекомендую скачать с оффсайта архив с набором свежих утилит. Из архива вам потребуется sqlite3.exe. Эта консольная программа умеет очень много полезного, о чем почитайте тут.
Ну и наконец создать базу в этой утилите можно так:
1. Запустить sqlite3.exe
2. Выполнить команду .open c:\\test.db3
Создать таблицу в базе и добавить в нее запись так:
3. Выполнить команду create table TestTable (TestField varchar(50));
4. Выполнить команду insert into table TestTable (TestField) values('test value');
Посмотреть содержимое таблицы так:
5. Выполнить команду select * from TestTable;
1
 Аватар для Beltar
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,662
19.09.2023, 08:10
Цитата Сообщение от krapotkin Посмотреть сообщение
точно ни к чему визуальному не был подсоединен компонент?
Подцеплен. Известный баг?
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
19.09.2023, 09:41
это не баг.
это поведение
надо каждый раз же все это великолепие пытаться перерисовать или хотя бы понять, что из этого на экране, что - нет
поэтому
Delphi
1
2
dataset.DisableControls;
dataset.EnableControls;
0
 Аватар для Beltar
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,662
19.09.2023, 10:01
Вру. Не подцеплен. За год уже подзабыл детали.

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
function TfmMain.ImportXLS4(const FN: String; Q:TFDQuery; PackSize:Integer;
  var ErrCount:Integer): Integer;
var S, TGr:String;
    i:Integer;
 
begin
ErrCount:=0;
if not FileExists(FN) then Exit(ErrFileNotFound);
Result:=0;
OpenFile(FN,Q,4);
Q.First;
DM.QWriter.SQL.Clear;
try
Q.DisableControls;//Потому что на нем превью данных висит.
for i:=0 to Q.RecordCount-1 do
  begin
  if Q.Fields[0].IsNull then
    begin
    Q.Next;
    Continue;
    end;
  Tgr:=Q.Fields[3].AsString;
  if Tgr='0' then
    S:='Insert into Данные4 (Id, Время, НомерПрограммы, Класс ) '+
      ' Values ('''+Q.Fields[0].AsString+''', '+
      ''''+Q.Fields[1].AsString+''', '+
      ''''+Q.Fields[2].AsString+''', '+
      ''''+Q.Fields[3].AsString+'''); '
             else
      begin
      S:='Insert into Данные4 (Id, Время, НомерПрограммы, Класс, '+
      'РСпч, РСпрч, ИРСпч, ИРСпрч, БСпч, БСпрч, ИБСпч, ИБСпрч, '+
      'ГармРС1пч, ГармРС1прч, ГармРС2пч, ГармРС2прч, Гарм1БСпч, Гарм1БСпрч, '+
      'IPпч, IPпрч, IPVпч, IPVпрч, CONY, PLYS, ББсв, РБц, ББсн, Вып_св, Вып_сн,'+
      'Стяж_св, Стяж_сн, Стат_дисб, Дисб_св, Дисб_сн, Дисб_п, Вес) '+
      ' Values ('+Q.Fields[0].AsString+', '+
      ''''+Q.Fields[1].AsString+''', '+
      Q.Fields[2].AsString+', '+
      Q.Fields[3].AsString+', ';
      for var j:=4 to 35 do
        S:=S+' '+FastReplace(Q.Fields[j].AsString)+',';
      S[Length(S)]:=')';
      S:=S+';';
      end;
  DM.QWriter.SQL.Add(S);//Вот здесь
  if DM.QWriter.SQL.Count>=PackSize then {По дефолту PackSize=50, так бы кидал по 1000 или даже все,
 т. к. там объем вставки не более нескольких тысяч, и не заморачивался,
 впрочем, при мелких пачках ошибки вставки некритичны}
    begin
    try
    DM.QWriter.ExecSQL;
    except
    Result:=ErrDBError;
    Inc(ErrCount);
    end;
    DM.QWriter.SQL.Clear;
    end;
  Q.Next;
  end;
 
try
if DM.QWriter.SQL.Count>0 then DM.QWriter.ExecSQL;
except
Result:=ErrDBError;
Inc(ErrCount);
end
finally
Q.First;
Q.EnableControls;
end;
end;
1
1 / 1 / 0
Регистрация: 29.06.2015
Сообщений: 134
19.09.2023, 14:52  [ТС]
Ребята Все здравствуйте и отличного настроения насколько это возможно!

1.
Уверен что Вам сложно чтото советовать как минимум непонимая как выглядит сам файл который я называю базой.
82894 города TIR.rar
Поэтому посмотрите пожалуйста на этот список выше и скажите пожалуйста,
- может быть прежде чем создавать базу где либо стоит массово удалить лишние теги, символы и прочую повторяющуюся мелочь?
- если оставить всё как есть то на первый взгляд видно что это JSON однако начальные: content [ и в конце ] были удалены от чего структура нескольк изменилась, попытаться добавить первоначальный вид или можно оставить всё как есть?

2. Как верно подмечено, госп-м Крапоткиным, задача не простая для новичка, поэтому давайте начнём с создания самой базы, а после уже поговорим о том как проводить по ней поиск.

3.
рекомендую скачать с оффсайта архив с набором свежих утилит. Из архива вам потребуется sqlite3.exe. Эта консольная программа умеет очень много полезного
Спасибо гос-н Пытливый за замечательную утилиту и инструкцию взял на вооружение пригодится!
...однако проводя манипуляции с созданием базы по Вашей инструкции получил сообщение:
Code
1
Parse error: file is not a database (26)
.. признаюсь Ребята, запутался.
Вот есть у меня предположим пустая прога и єтот файл со списком из 82894 строк. Какие дальнейшие действия?
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
19.09.2023, 14:55
утверждать не буду, но подозреваю, тут query не делает примерно ничего, кроме передачи текста скрипта на сервер
в целом, я даже не знал, что в Query можно вставить более одного SQL выражения))
при работе с сервером Firebird это например, точно не работает
но там есть безымянные блоки
в них есть явное ограничение на количество выражений в блоке - 256
поэтому тоже делаю апдейты, разбивая на части.
но само исполнение на сервере - очень быстрое

Добавлено через 1 минуту
Цитата Сообщение от Ltybcrf Посмотреть сообщение
запутался.
возьми https://sqlitebrowser.org/, там кнопка есть

Добавлено через 1 минуту
Цитата Сообщение от Ltybcrf Посмотреть сообщение
Какие дальнейшие действия
воспроизвести пример №1 из видео про FDMemTable, только строки взять из файла
1
 Аватар для Beltar
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,662
19.09.2023, 16:05
OK, это просто список городов, у каждого есть Id, страна, название, широта и долгота.

Если бы мне надо было сделать БД на основании этого файла, то я бы сразу спросил следующее:
1) Как присвоены Id? Они из какого-то справочника и вводятся пользователем вручную, или это автоинкрементное поле и вообще данная БД не должна ни с чем связываться?
2) Что такое Areaid? Я вижу, что это был какой-то старый украинский справочник, но для др. стран там указано только число? Откуда оно взялось?

Для того, чтобы удобно было редактировать, логично выделить таблицы-справочники по стране, и, видимо, справочник регионов изначально был. После ответов на эти вопросы можно создавать базу с таблицами.

в целом, я даже не знал, что в Query можно вставить более одного SQL выражения))
при работе с сервером Firebird это например, точно не работает
В Access тоже не работает, а вот, что касается передачи на сервер (MS SQL Server), то в описанном выше примере с переносом данных с флешки я сначала тоже не думал, что надо именно так. И файл у меня вносился сначала 5 минут, потом 3.5 после некоторых оптимизаций. А потом, когда я сделал пакетную передачу, вноситься стал 7 секунд Т. е. выполнение ускорилось в 30 раз. И это логично, передать по сети 1, или несколько раз большую пачку и передавать каждый Insert раздельно. И тогда при вносе партиями по 10к Insert'ов, у меня все нормально было. И на самом сервере, транзакция начинается, когда приходит пачка и на последнем скрипте заканчивается. Что быстрее, 10к скриптов в одной транзакции, или каждый скрипт в отдельной транзакции?

Т. е. для MS SQL Server это как в его родном Managment Studio просто через ; набрать скрипты, и они все выполнятся.

Query передачу скрипта не начнет, пока не будет ExecSQL, но операция банального добавления строк в TSrings не может иметь квадратичную зависимость. Я даже пробовал в TStringList собрать и сделать Assign, собирается мгновенно, ассаигнится долго.
0
1 / 1 / 0
Регистрация: 29.06.2015
Сообщений: 134
19.09.2023, 16:43  [ТС]
Госп-н Beltar,
Каждый ID в начале = соответствует городу.
Ареа = ID области

..надо только добавить эту базу и иметь возможность найти номер нужной мне строки, например ту в которой есть слово Москва, неважно даже если есть несколько строк где есть слово Москва, просто чтобы нашло.

У меня сейчас всё работает как я выше писал разделив эту базу на три мемо и успешно всё находит и обрабатываю дальше как мне нужно.
Всё дело в скорости, если добавление в базу данных SQL увеличит скорость поиска нуджной строки во время работы цикла, то мне бы очень хотелось добавить такую базу в прогу.

С головой ушел в изучение думаю дня мне хватит.

Господин Крапоткин Вы такую инфу даёте слюнки текут, спасибо Вам большое!
Ребята всем разумеется большое спасибо!

Пройду первый этап отпишусь, может быть дальше пойдёт всё "как п маслу"...

С уважением, Денис.
0
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
19.09.2023, 18:16
Прикрепленный файл имеет нарушения структуры Json. Вот что у вас имеется:
{"id":49,"name":"Луганск","countrySign": "UA","areaId":Луганская"lat":48.574041," lon":39.307815}
а вот так это должно быть:
{"id":49,"name":"Луганск","countrySign": "UA","areaId":"Луганская","lat":48.57404 1,"lon":39.307815}
и такое нарушение в каждой строке. Откуда вы получили этот файл?
0
1 / 1 / 0
Регистрация: 29.06.2015
Сообщений: 134
19.09.2023, 18:21  [ТС]
Да я говорил выше что есть нарушение.. это вобщем то был нормальный JSON но в результате работы с ним он стал таким.
Там ге можн овзять эти строки их можно брать только по сто, я сделал прожку которой выбрал по сто штучек все 80 000 но в результате сложения в мемо каждых ста строк формат побился ...
0
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
19.09.2023, 18:27
Это как же надо было изуродовать файл - пипец просто. Часть строк не разделены запятыми, где ни попадя вставлены квадратные скобки. В таком виде его ни один json-парсер не примет.
0
 Аватар для Beltar
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,662
19.09.2023, 18:58
Работать надо с копией.
Я понимаю, что Id - это код города, и первичный ключ таблицы, вопрос, как этот Id назначается, автоматически движком БД по счетчику (при вставке в такое поле надо явно разрешать вставку в него), или его человек вводит. А может и не вводит, но фиксированный набор данных - это маловероятно.

С областями, куда они все делись, ну и тоже вопрос, кто этот код назначил.

Самая очевидная структура таблиц может быть такой, связи тоже сделаны в схеме данных. Правда, Access в силу врожденного идиотизма не может даже слизать интерфейс управления MS SQL Server и сразу показывать отдельно целые и вещественные типы в структуре. Выбирай числовой, а потом уже длинное целое, или вещественное, как и допустимость пустого значения.
Вложения
Тип файла: zip города.zip (13.5 Кб, 5 просмотров)
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
19.09.2023, 19:50
Цитата Сообщение от Ltybcrf Посмотреть сообщение
но в результате сложения в мемо каждых ста строк формат побился ...
Это какая-то фантастика. При добавлении в Memo строки не изменяются.
0
 Аватар для Beltar
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,662
19.09.2023, 19:52
Пальчики в розетку тоже не лезут, но ведь всегда можно гвоздики взять.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.09.2023, 19:52

Как и где хранить текстовую информацию для программы тестирования?
Создаю проект по тестированию. Как и где можно хранить информацию по вопросам и ответам, т.е. откуда брать вопросы? И как их извлекать в...

Как лучше хранить большую корзину (больше 140-170 товаров)?
Сейчас храню корзину в куках (id-товара и количество). Но при количестве товаров больше 140-170 они начинают пропадать из корзины (из-за...

Как лучше сделать большую базу данных?
Уважаемые знатоки, подскажите, пожалуйста, как лучше сделать большую базу данных. Уже несколько дней сижу и перечитываю все возможные...

Где хранить базу данных?
Нужно разработать программу которая работает по локальной сети. С ее помощью можно отправлять и получать сообщения. Я всё сделал, но на ...

Где лучше хранить информацию
Здравствуйте уважаемые форумчане. У меня есть числовой набор данных. При нажатии на submit какое то из этих чисел будет обновляться....


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru