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

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

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

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

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

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

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

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

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

Попробуй создать файл подкачки и работать с ним, как с памятью. Ниже пример кода, для создания такого файла:
Код:
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, 10:15   #7
fatesmile
Новичок
Джуниор
 
Регистрация: 18.01.2010
Сообщений: 7
По умолчанию

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

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

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

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

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


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


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS