Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> out of memory очень большой массив 
V
    Опции темы
valerchi
Дата 5.12.2011, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 27.5.2008
Где: Геническ

Репутация: нет
Всего: нет



Помогите, пожалуйста. Мне нужно заполнить в массив много чисел, (300 миллионов). При загрузке случайных чисел, где-то на 100 млн. вылетает ошибка "out of memory". Что можно сделать?
PM MAIL   Вверх
500mhz
Дата 5.12.2011, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



массив в памяти я так понимаю? может ее просто не хватает? )


--------------------

PM MAIL ICQ   Вверх
valerchi
Дата 5.12.2011, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 27.5.2008
Где: Геническ

Репутация: нет
Всего: нет



Цитата(500mhz @ 5.12.2011,  18:44)
массив в памяти я так понимаю? может ее просто не хватает? )

Ну, я так понял, что её не хватает. Может как-то можно её увеличить? (У меня одномерный массив)

Это сообщение отредактировал(а) valerchi - 5.12.2011, 20:34
PM MAIL   Вверх
500mhz
Дата 5.12.2011, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



на диск в файлик не можно генерить?


--------------------

PM MAIL ICQ   Вверх
valerchi
Дата 5.12.2011, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 27.5.2008
Где: Геническ

Репутация: нет
Всего: нет



Цитата(500mhz @ 5.12.2011,  21:03)
на диск в файлик не можно генерить?

Я так когда-то делал. Много чисел в текстовый файл не записать, разве, что разбить его на много файлов, - но это очень неудобно. Может что-то попроще можно придумать?
PM MAIL   Вверх
Dik0n
Дата 5.12.2011, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 11.5.2011

Репутация: нет
Всего: 10



CreateFile -> CreateFileMapping -> MapViewOfFile и работаешь себе через указатель
--------------------
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ◄◄◄ Сотри монеткой защитный слой
PM MAIL WWW   Вверх
valerchi
Дата 5.12.2011, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 27.5.2008
Где: Геническ

Репутация: нет
Всего: нет



Цитата(Dik0n @ 5.12.2011,  21:44)
CreateFile -> CreateFileMapping -> MapViewOfFile и работаешь себе через указатель

А можно по-подробнее?
PM MAIL   Вверх
Dik0n
Дата 5.12.2011, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 11.5.2011

Репутация: нет
Всего: 10



Цитата(valerchi @  5.12.2011,  22:02 Найти цитируемый пост)
А можно по-подробнее?

Вот упрощенный вариант, в коде отсутствуют проверки на ошибки.

Код

procedure TfmMain.ButtonClick(Sender: TObject);
const
  SIZE = 100 * 4; // размер данных
var
  hFile   : dword;
  Mapping : dword;
  Buf     : PIntegerArray;
  I       : Integer;
begin
  hFile := CreateFile('FileName', GENERIC_READ or GENERIC_WRITE,
                      FILE_SHARE_READ or FILE_SHARE_WRITE, nil,
                      OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  Mapping := CreateFileMapping(hFile, nil, PAGE_READWRITE, 0, SIZE, nil);
  Buf := MapViewOfFile(Mapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);

  for I := 0 to SIZE div 4 do
  begin
    Buf^[I] := I;
  end;

  UnmapViewOfFile(Buf);
  CloseHandle(Mapping);
  CloseHandle(hFile);
end;


Это сообщение отредактировал(а) Dik0n - 5.12.2011, 23:17
--------------------
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ◄◄◄ Сотри монеткой защитный слой
PM MAIL WWW   Вверх
northener
Дата 5.12.2011, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(valerchi @  5.12.2011,  21:08 Найти цитируемый пост)
Много чисел в текстовый файл не записать, разве, что разбить его на много файлов

Это, пардон, "как и почему"?
Да и зачем записывать числа в текстовый файл, если сей файл не нужно читать в Блокноте?


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
valerchi
Дата 6.12.2011, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 27.5.2008
Где: Геническ

Репутация: нет
Всего: нет



Цитата(Dik0n @ 5.12.2011,  23:15)
Цитата(valerchi @  5.12.2011,  22:02 Найти цитируемый пост)
А можно по-подробнее?

Вот упрощенный вариант, в коде отсутствуют проверки на ошибки.

Код

procedure TfmMain.ButtonClick(Sender: TObject);
const
  SIZE = 100 * 4; // размер данных
var
  hFile   : dword;
  Mapping : dword;
  Buf     : PIntegerArray;
  I       : Integer;
begin
  hFile := CreateFile('FileName', GENERIC_READ or GENERIC_WRITE,
                      FILE_SHARE_READ or FILE_SHARE_WRITE, nil,
                      OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  Mapping := CreateFileMapping(hFile, nil, PAGE_READWRITE, 0, SIZE, nil);
  Buf := MapViewOfFile(Mapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);

  for I := 0 to SIZE div 4 do
  begin
    Buf^[I] := I;
  end;

  UnmapViewOfFile(Buf);
  CloseHandle(Mapping);
  CloseHandle(hFile);
end;

Сложно, я не потяну....

Добавлено через 57 секунд
Цитата(northener @ 5.12.2011,  23:24)
Цитата(valerchi @  5.12.2011,  21:08 Найти цитируемый пост)
Много чисел в текстовый файл не записать, разве, что разбить его на много файлов

Это, пардон, "как и почему"?
Да и зачем записывать числа в текстовый файл, если сей файл не нужно читать в Блокноте?

А в какой файл?
PM MAIL   Вверх
northener
Дата 6.12.2011, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(valerchi @  6.12.2011,  00:43 Найти цитируемый пост)
А в какой файл? 

В бинарный. Даже если числа типа Extended, то файл будет всего менее 2.5 ГБ. Что согласитесь в нынешнее время сущие пустяки.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
valerchi
Дата 7.12.2011, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 27.5.2008
Где: Геническ

Репутация: нет
Всего: нет



Цитата(northener @ 6.12.2011,  23:51)
Цитата(valerchi @  6.12.2011,  00:43 Найти цитируемый пост)
А в какой файл? 

В бинарный. Даже если числа типа Extended, то файл будет всего менее 2.5 ГБ. Что согласитесь в нынешнее время сущие пустяки.

Спасибо, сейчас буду пробовать.
PM MAIL   Вверх
valerchi
Дата 8.12.2011, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 27.5.2008
Где: Геническ

Репутация: нет
Всего: нет



Цитата(northener @ 6.12.2011,  23:51)
Цитата(valerchi @  6.12.2011,  00:43 Найти цитируемый пост)
А в какой файл? 

В бинарный. Даже если числа типа Extended, то файл будет всего менее 2.5 ГБ. Что согласитесь в нынешнее время сущие пустяки.

Всё, получилось, спасибо. Заполнил 300 млн случайных чисел (двухзначных). Файл получился размером 1,11гб.Получился такой код:
Код

..................
begin
assignfile(d,'d:\massiv 300 mln.dat');
rewrite(d);
repeat
inc(s);
k:=random(99);
write(d,k);
until s=300000007;      
closefile(d);
end; 
......................


Это сообщение отредактировал(а) valerchi - 8.12.2011, 18:36
PM MAIL   Вверх
valerchi
Дата 10.12.2011, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 27.5.2008
Где: Геническ

Репутация: нет
Всего: нет



Объясните пожалуйста, почему функция 
Код

seek(d,600000000);
(600 миллионов) не работает? Очень большое число? Тогда что можно придумать?
PM MAIL   Вверх
valerchi
Дата 10.12.2011, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 27.5.2008
Где: Геническ

Репутация: нет
Всего: нет



Цитата(~FoX~ @ 10.12.2011,  15:31)
Цитата(valerchi @  10.12.2011,  15:26 Найти цитируемый пост)
 не работает? Очень большое число? Тогда что можно придумать? 

в seek N параметр- integer, 600 лямов, многовато...
Разбить на несколько файлов

Понял, большое спасибо.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0774 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.