Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Delphi > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 18.01.2010, 10:16   #1
fatesmile
Новичок
Джуниор
 
Регистрация: 18.01.2010
Сообщений: 7
Репутация: 10
По умолчанию Как создать огромный массив?

Добрый день всем! Собственно описание проблемы:
есть класс MyClass, состоящий из 9 полей следующих типов: boolean; integer; integer; boolean; boolean; boolean; boolean; integer; boolean. Необходимо создать массив (желательно динамический) типа array of MyClass, который будет содержать 100000000-200000000 записей. Стандартными путями он создается, но при заполнении массива где то на 49000000 элементе выскакивает ошибка нехватки памяти. Процесс при этом занимает около 2 гигов. Что можно сделать в данной ситуации? Заранее спасибо.
fatesmile вне форума   Ответить с цитированием
Старый 18.01.2010, 10:44   #2
Stilet
Белик Виталий :)
Профессионал
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Адрес: Украина, Донецкая область, г. Краматорск
Сообщений: 57,840
Репутация: 6850
По умолчанию

Если не секрет зачем такой огромный массив?
__________________
I'm learning to live...
Stilet вне форума   Ответить с цитированием
Старый 18.01.2010, 10:53   #3
fatesmile
Новичок
Джуниор
 
Регистрация: 18.01.2010
Сообщений: 7
Репутация: 10
По умолчанию

не секрет, для дисера
fatesmile вне форума   Ответить с цитированием
Старый 18.01.2010, 10:57   #4
raxp
Профессионал
 
Регистрация: 29.09.2009
Сообщений: 9,742
Репутация: 3006
По умолчанию

работайте значит не с памятью, а с файловым потоком...
__________________
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума   Ответить с цитированием
Старый 18.01.2010, 11:00   #5
fatesmile
Новичок
Джуниор
 
Регистрация: 18.01.2010
Сообщений: 7
Репутация: 10
По умолчанию

а можно поконкретнее, как сделать чтобы массив не с памятью работал. и потом, скорость работы с ним будет уже совсем другая правильно? можно ли сделать чтобы он сколько мог брал оперативки, а остальное - с винта?
fatesmile вне форума   Ответить с цитированием
Старый 18.01.2010, 11:04   #6
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
Репутация: 125

skype: maxionans
По умолчанию

Попробуй создать файл подкачки и работать с ним, как с памятью. Ниже пример кода, для создания такого файла:
Код:
var
  FileHandle : THandle;
  Mapping : THandle;
  Data : Pointer;
  Offset : Int64Rec;
begin
  { Создаем файл, который будем отображать в память }
  FileHandle := CreateFile(
    'd:\cache.dat', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ, nil,
    CREATE_NEW, FILE_FLAG_DELETE_ON_CLOSE, 0
  );
  Assert( FileHandle <> INVALID_HANDLE_VALUE );

  try
    { Задаем размер файла в 4 GB }
    Int64(Offset) := $100000000;
    SetFilePointer( FileHandle, Offset.Lo, @Offset.Hi, FILE_BEGIN );
    SetEndOfFile( FileHandle );

    { Создаем объект отображения файла }
    Mapping := CreateFileMapping( FileHandle, nil, PAGE_READWRITE, 0, 0, nil );
    Assert( Mapping <> 0 );

    { Отображаем файл в память.
      0, 0 - смещение относительно начала файла к отображаемому блоку,
      $40000000 - размер отображаемого блока (1 GB) }
    Data := MapViewOfFile( Mapping, FILE_MAP_WRITE, 0, 0, $40000000 );
    try
      if not Assigned( Data ) then
        begin
          MessageBox( 0, PChar(SysErrorMessage( GetLastError )), nil, MB_OK or MB_ICONWARNING );
          Exit;
        end;

      { ...
        Здесь работа с памятью
        ... }
    finally
      { Завершаем работу с отображенным блоком }
      UnmapViewOfFile( Data );
    end;
  finally
    { Закрываем объект отображения и файл }
    CloseHandle( Mapping );
    CloseHandle( FileHandle );
  end;
maxionans вне форума   Ответить с цитированием
Старый 18.01.2010, 11:15   #7
fatesmile
Новичок
Джуниор
 
Регистрация: 18.01.2010
Сообщений: 7
Репутация: 10
По умолчанию

извиняюсь за глупый вопрос, чтобы работать с памятью я просто могу написать setlength(mas,100000000) или мне нужно указать еще что-то?
fatesmile вне форума   Ответить с цитированием
Старый 18.01.2010, 11:17   #8
Stilet
Белик Виталий :)
Профессионал
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Адрес: Украина, Донецкая область, г. Краматорск
Сообщений: 57,840
Репутация: 6850
По умолчанию

Цитата:
для дисера
Класно рассказал...
Даже для докторской такие огромные массивы не выделяют.
Зачем такой огромный массив?
Цитата:
можно ли сделать чтобы он сколько мог брал оперативки, а остальное - с винта?
Эх... Я бы на твоем месте про такую стратегию забыл. Прога жрущая много памяти никому не понравится.
Насчет файлов мысль светлая. Скорость работы с массивом записанным в файл не будет сильно занижена, если ты не будешь использовать медленные алгоритмы обработки.
Например будет удобно использовать TFileStream. Он дает приличную скорость работы.
Цитата:
я просто могу написать
Можешь, но ОС это не понравится.
__________________
I'm learning to live...
Stilet вне форума   Ответить с цитированием
Старый 18.01.2010, 11:21   #9
fatesmile
Новичок
Джуниор
 
Регистрация: 18.01.2010
Сообщений: 7
Репутация: 10
По умолчанию

такой вопрос можно ли не меняя самого кода перевести все на работу с файлами, то есть у меня задан динамический массив a: array of myclass далее я ему делаю setlength. можно как то не править весь код?
fatesmile вне форума   Ответить с цитированием
Старый 18.01.2010, 11:23   #10
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
Репутация: 125

skype: maxionans
По умолчанию

Динамические массивы тут не прокатят. Тебе нужно объявить такие типы:

Код:
type
  PMyClassArr = ^TMyClassArr;
  TMyClassArr = array[ 0..( MaxInt div SizeOf(MyClass) ) - 1 ] of MyClass;
И использовать отображенный блок таким образом:
Код:
var
  MyArr : PMyClassArr;
begin
   ...здесь отображаешь файл в память...
   MyArr := Data;
   ...дальше работаешь с MyArr как с обычным массивом...  
end;
maxionans вне форума   Ответить с цитированием
Ответ

Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как создать многомерный динамический массив в Delphi? Velross Помощь студентам 3 06.01.2010 21:50
как создать массив lg12 Помощь студентам 4 17.08.2009 13:50
Как создать массив-константу из записей SNUPY Общие вопросы Delphi 3 19.03.2009 22:11
Как создать массив заполняемый с клавиатуры? Bravo Общие вопросы C/C++ 2 14.11.2008 01:23
Подскажите, как создать динамический массив? snaem Общие вопросы .NET 9 14.05.2008 08:52


12:06.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.