powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как работать с очень большими масивами
25 сообщений из 315, страница 5 из 13
Как работать с очень большими масивами
    #39547480
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUЕсть у нас тут один специалист. Большой знаток оптимизаций в БД и вообще СУБД :)
И ваши чувства, кажется, взаимны
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39547500
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Нет у меня никаких чувств. Просто есть забавный персонаж, который только на словах Лев Толстой :)
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39547727
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecatorGerasimenkoАндрей Игоревич,

MSSQL с такими файлами справляется на раз, в считанные секунды.
Хранимка обеспечит всю обработку.
https://msdn.microsoft.com/ru-ru/library/ms188365(v=sql.120).aspx

Oracle тоже !


Я как бы ораклист, хотя и непродвинутый, и у меня вопрос - а оно в бесплатный оракул влезае? А то платный, он небесплатный. (Каламбур). и какое нужно железо..... ну не ложится у меня в душе схема данных, хоть в каше с мампсом (храни нас эволюция) посылай.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39548543
Потихоньку разбираться в ваших предложениях, читать про СУБД, как я понял в теме мне суммарно предложили 3 варианта обработки данных:

1. БД (Оракл, Парадокс, всякие SQL и ещё что-то там).
2. Кешировать массив на диске.
3. Куча способов прямого многопоточного считывания данных посредством всяких библиотек и прямой работы с ними.

Про БД, вроде любопытно, хотя и ощущается как костыль, но пока только вникаю. Хотя освоение SQL явно пока отложу. Посоветуйте СУБД максимально простую в освоении для начала.

И вопрос, как реализовать? Как одну огромную таблицу типа

Код: pascal
1.
2.
3.
4.
1    1    1    1    1    9.87e31
1    1    1    1    2    1.23e13
..........
20   60   60  163  312  1.11e30


Где ключ первые 5 столбцов или иерархически:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
1 
2
3
4
 
1 1          2 1    ...
1 2          2 2    ... 
...          ...    ...
1 60         2 60   ...

1 1   ...
1 2   ...
...   ...
1 60  ...

....
....
....

163 1    3.33e22
163 2    2.22e31
163 312  1.11e30


Где всё - отдельные таблицы (чет много будет таблиц), второй столбец каждой таблицы - ключ, первый - индекс от ключа предыдущего уровня (как он там называется) .

Но вообще, как-то сложно :), сначала файлы как-то надо перегнать всё БД, потом на ходу считывать и с этим работать, потом удалять (а ведь мне подобные данные массивы по 3 раза в месяц иногда приходят).


Про кеширование, я так понимаю это возможно только на Делфи 64, ибо мой компилятор просто не компилирует подобную запись с формулировкой "массив больше 2 гб". Вопрос - где взять Делфи 64?

В итоге я склоняюсь к многопоточной прямой работе с файлами, то есть сначала перегоняю их в типизированные файлы, а потом подгружаю их по мере формирование запросов? По крайне мере просто реализуется и понятно логичкски.


Варианты "поднять\использовать сервер" - не рассматриваю, не то что бы у меня не было такой возможности, но это как-то слишком для такой задачи.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39548602
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрей ИгоревичПро кеширование, я так понимаю это возможно только на Делфи 64
Не обязательно. В windows есть механизм отображения файлов в память (file mapping). Буферизацией в этом случае занимается операционная система.
Если у вас win64 и более 4G оперативной памяти, то в этом случае есть смысл подумать о 64-битном компиляторе.
Вместо Delphi можно посмотреть в сторону Lazarus .

пример использования File Mapping для x86 (32 бита)
Код: 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.
uses SysUtils;
procedure MappingFileError(var f: file);
begin
  MessageBox(SysErrorMessage(GetLastError));
  Halt(0);
end; { MappingFileError }

type 
  t_Record = paced record // описание структуры данных
  end;

var
  { отображение файла в память }
  hMapFile: THandle;   // описатель объекта отображения файла в память
  pMapFile: pointer;   // указатель на данные

  f_Dtm: file of t_Record;
  pItem: ^t_Record;
  idxItem: LongWord;

  ofm: byte;
begin
  AssignFile(f_Dtm, 'D:\FIleMap.dtm'); 
  ofm := FileMode;
  FileMode := 0; // только чтение
  Reset(f_dtm);
  FileMode := ofm;

  hMapFile := CreateFileMapping(
                  TFileRec(f_Dtm).Handle, // описатель файла
                  nil,                    // атрибуты защиты
                  PAGE_READONLY,          // права доступа (только чтение)
                  0, 0,                   // размер памяти (0 - весь файл)
                  nil                     // не именованная область
                                  );
    if hMapFile = 0 then  MappingFileError(f_Dtm); // генерация ошибки
    pMapFile := MapViewOfFile(
                  hMapFile,      // описатель, полученный выше
                  File_Map_Read, // права доступа (только чтение)
                  0, 0,          // начало области отображения
                  0              // размер области отображения (0-все)
                                );
    if pMapFile = nil then MappingFileError(f_Dtm); // генерация ошибки

    pItem := pMapFile;
    for idxItem := 1 to FileSize(f_Dtm) do begin
        // обработка элемента
        ....
        // переход к следующему
       LongWord(pIterm) := LongWord(pItem) + SizeOf(t_Record);
    end;

    UnMapViewOfFile(pMapFile);
    CloseHandle(hMapFile);

    CloseFile(f_Dtm);
end;


...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39548745
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичПотихоньку разбираться в ваших предложениях, читать про СУБД, как я понял в теме мне суммарно предложили 3 варианта обработки данных:

1. БД (Оракл, Парадокс, всякие SQL и ещё что-то там).
2. Кешировать массив на диске.
3. Куча способов прямого многопоточного считывания данных посредством всяких библиотек и прямой работы с ними.

Про БД, вроде любопытно, хотя и ощущается как костыль, но пока только вникаю. Хотя освоение SQL явно пока отложу. Посоветуйте СУБД максимально простую в освоении для начала.

И вопрос, как реализовать? Как одну огромную таблицу типа

Код: pascal
1.
2.
3.
4.
1    1    1    1    1    9.87e31
1    1    1    1    2    1.23e13
..........
20   60   60  163  312  1.11e30


Под описанную задачу так и просится Cache' - там вся база как огромный многомерный массив.
http://docs.intersystems.com/csp/docbook/DocBook.UI.Page.cls?KEY=GGBL_intro
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39548796
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir BaskakovЯ как бы ораклист, хотя и непродвинутый, и у меня вопрос - а оно в бесплатный оракул влезае?последние годы в оракле есть опция in-memory с колоночным хранением что позитивно сказывается на скорострельности аналитических запросов но есть ли оно во фришной редакции тоже не скажу
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39548850
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичПотихоньку разбираться в ваших предложениях, читать про СУБД, как я понял в теме мне суммарно предложили 3 варианта обработки данных:

1. БД (Оракл, Парадокс, всякие SQL и ещё что-то там).
2. Кешировать массив на диске.
3. Куча способов прямого многопоточного считывания данных посредством всяких библиотек и прямой работы с ними.

Про БД, вроде любопытно, хотя и ощущается как костыль, но пока только вникаю. Хотя освоение SQL явно пока отложу. Посоветуйте СУБД максимально простую в освоении для начала.

И вопрос, как реализовать? Как одну огромную таблицу типа

Код: pascal
1.
2.
3.
4.
1    1    1    1    1    9.87e31
1    1    1    1    2    1.23e13
..........
20   60   60  163  312  1.11e30


Где ключ первые 5 столбцов или иерархически:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
1 
2
3
4
 
1 1          2 1    ...
1 2          2 2    ... 
...          ...    ...
1 60         2 60   ...

1 1   ...
1 2   ...
...   ...
1 60  ...

....
....
....

163 1    3.33e22
163 2    2.22e31
163 312  1.11e30


Где всё - отдельные таблицы (чет много будет таблиц), второй столбец каждой таблицы - ключ, первый - индекс от ключа предыдущего уровня (как он там называется) .

Но вообще, как-то сложно :), сначала файлы как-то надо перегнать всё БД, потом на ходу считывать и с этим работать, потом удалять (а ведь мне подобные данные массивы по 3 раза в месяц иногда приходят).


Про кеширование, я так понимаю это возможно только на Делфи 64, ибо мой компилятор просто не компилирует подобную запись с формулировкой "массив больше 2 гб". Вопрос - где взять Делфи 64?

В итоге я склоняюсь к многопоточной прямой работе с файлами, то есть сначала перегоняю их в типизированные файлы, а потом подгружаю их по мере формирование запросов? По крайне мере просто реализуется и понятно логичкски.


Варианты "поднять\использовать сервер" - не рассматриваю, не то что бы у меня не было такой возможности, но это как-то слишком для такой задачи.

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

В оракле таблицы можно партиционировать, то есть делить данные допустим по периодам, если запрос позволяет сразу определить нужную партицию (партиции) - данные конечно возвращаются быстрее. В других базах тоже, можно - про файербёрд не знаю, а в постгрессе вроде было.

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

Возможно, стоит продублировать вопрос в разделах баз, конкретно - firebird, ms sql server. postgress, mySql. Оракл все же ставить посложнее, лучше не надо, а эти четыре - нормально.

Базы без сервера, типа акцесса, к такой работе не приспособлены.
но если хотите попробовать, то попробуйте http://www.webdelphi.ru/2016/08/sqlite-v-delphi-bolshoj-obzor-i-litedac-v-primerax/ - предполагаю, что разочарует.

разве что, если загонять разные срезы в несколько файлов данных.....
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39548853
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ой, посмотрел, не надо SQLite -

•не рекомендован для баз большого размера (эксперты не рекомендуют более 200 Мб);
• есть только два типа данных – целое автоинкримент и строка (всё остальное – эмулируется через строки);
• не предназначен для многопользовательского использования (хотя это и возможно).


а попробуйте для начала как DarkMaster говорил - Firebird, одна таблица, просто вставить нужное количество записей - какого размера станет файл БД, на глаз, ну и пару запросов - хоть тупо сумму по всем полям - сколько протормозит.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39548892
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я рекомендую MS SQL, он прост в установке и комплектом идет Management Studio. Ну и инструменты массовой загрузки.

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

Oracle сложнее ставить, да и ИМХО не для новичков.
Про Firebird ничего сказать не могу - не работал.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39548959
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FB ставится минуты за 2 минуты. Если IBEXprert'ом делать базу - то простую таблицу сделать - несколько минут. Им же можно залить данные в базу. Им же погонять запросы. В целом - то Делфи нужна больше для отображения результатов. Так то всё можно и в эксперте погонять, для оценки производительности, думаю, вполне его достаточно безо всякого кода.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39548998
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
- Коллега крутил постгресс под виндой, и вроде проблем не было. Сам не пробовал, врать не буду, но так мне хвалили.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39549045
bk0010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО, прав был тот, кто советовал работать с двоичными файлами. Создайте из ваших сырых данных несколько двоичных файлов, разбитых по смыслу и, возможно, по времени так, чтобы их можно было полностью загрузить в память. Загрузили, обсчитали один файл, сохранили результат, загрузили, обсчитали следующий. СУБД может дать очень большие накладные расходы, если данные надо не искать, а обрабатывать последовательно.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39549061
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы свел к двоичному файлу со структурой как у таблицы.
Измерение1, Измерение2, Измерение3, Измерение4, Измерение5, Значение
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39549082
bk0010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шавлюк ЕвгенийЯ бы свел к двоичному файлу со структурой как у таблицы.
Измерение1, Измерение2, Измерение3, Измерение4, Измерение5, ЗначениеТолько Значение.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39549438
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bk0010ИМХО, прав был тот, кто советовал работать с двоичными файлами. Создайте из ваших сырых данных несколько двоичных файлов, разбитых по смыслу и, возможно, по времени так, чтобы их можно было полностью загрузить в память. Загрузили, обсчитали один файл, сохранили результат, загрузили, обсчитали следующий. СУБД может дать очень большие накладные расходы, если данные надо не искать, а обрабатывать последовательно.

так тут вопрос железа. Потянет или нет накладные расходы, за которые можно будет получать удобство и гибкость.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39549527
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bk0010Только Значение.
Согласен. Делаем пустой файл размером 20*60*60*163*312*sizeof(real)
По мере чтения заполняем значения сразу на нужное место.
В итоге файл получится индексированным. Навигация по нему станет тривиальной
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39549601
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шавлюк Евгений,

Да, подумаешь, всего 21 гиг...
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39549651
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747,

А разве это проблема? Не грузить же его единоразово в память? В виде БД все равно будет больше
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39549652
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747Шавлюк Евгений,

Да, подумаешь, всего 21 гиг...

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

может быть, хранить предрассчитанные агрегаты....
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39549655
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Baskakovбаза с ее накладными расходами это все минимум удвоит-утроит.
Вот вот.

Базу имеет смысл использовать только если задача по анализу стоит достаточно сложная.

Причем сложность заключается в требуемой множественности подходов к выборке данных.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39549721
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Да и из такого файла в базу перелить несложно, вот из исходных текстовых - сложнее.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39550064
proposal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
еще я бы подумал над группировкой (агрегацией) данных до такой степени, чтобы агрегированный массив влезал в 2Гб (или, для случая использования 64-битного компилятора, во всю имеющуюся оперативку) - возможно, это ускорило бы решение некоторых задач.

если нужны разные виды агрегирования (сумма, мин, макс, среднее и т.п.) - то несколько таких массивов
хранить, естественно, в бинарных файлах
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39550068
proposal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
proposalесли нужны разные виды агрегирования (сумма, мин, макс, среднее и т.п.) - то несколько таких массивовили, для задач, где нужно более 1 агрегата - несколько агрегатов в 1 влезающем в память массиве
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590179
Подниму старую свою тему на эту же тему, но не совсем.

Решил я не в один массив всё закинуть, а в разные (уже для других целей) и вышла такая ошибка, очевидно, что те же превышения 2гб, если массивы чуть порезать - всё норм



как победить?
...
Рейтинг: 0 / 0
25 сообщений из 315, страница 5 из 13
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как работать с очень большими масивами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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