2013-06-08 2 views
3

У меня есть тысячи строк кодов C++, которые хорошо работают на небольших текстовых файлах, но сбой в огромных текстовых файлах (например, размером 2 ГБ). Причина сбоя: приложение использует память.Как заставить C++ выделять память с диска?

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

Вот мои дизайнерские мысли:

  1. Создать временный файл для отображения файла (CreateFileMapping, OpenFileMapping)
  2. Force моего приложение для выделения памяти из временного файла
  3. ли некоторая очистка работы: CloseFileMapping и удалить временный файл

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

Я не уверен, что дизайн можно реализовать. Кто-нибудь может мне помочь?

PS: Я использую Visual C++ 2010.

+0

Дизайн, основанный на 'CreateFileMapping' и т. Д., Очевидно, разумен; многие приложения используют этот подход. Что именно вы спрашиваете? – user4815162342

+0

Как выпустить мой C++ для выделения памяти с диска? –

+0

Вы на 32-битной ОС? В этом случае вы можете столкнуться с проблемой виртуальной памяти. В противном случае ОС должна иметь возможность управлять памятью. Если на 64-битной ОС вы можете проверить свой допустимый предел VM (увеличение), и для VM вам также должно быть достаточно места на диске. – Abhinav

ответ

3

У меня есть тысячи строк кода на C++, которые хорошо работают на небольших текстовых файлов, но сбои на огромных текстовых файлов (таких как 2 размера GB). Причина сбоя: приложение использует память.

Вы пытаетесь загрузить весь файл в память на 32-битную систему (или на 64-битную систему с 2 ГБ ОЗУ или в 32-разрядное приложение, работающее на 64-битной системе). На 32-битной системе 2-гигабайтный текстовый файл не будет вписываться в память независимо от того, что вы делаете, потому что при 32-битной адресации вы можете работать с 2 гигабайтами оперативной памяти максимум, даже если она поддерживается файлом подкачки.

Решения.

  1. (самый простой) Файл процесса по строке, без загрузки всего файла в память.
  2. Создание сопоставления файлов. Даже при сопоставлении файлов вы не сможете сразу получить доступ к целому файлу, но вы сможете отображать его части в памяти.
+0

Собственно на 32-битных системах вы можете работать на 4 ГБ ОЗУ. Однако части этой ОЗУ уже приняты. – celtschk

+0

Отображение карты - правильная вещь. Они НЕ так тяжелы, как выглядят. – vrdhn

+0

Итак, суть моей проблемы заключается в том, как заставить выделять память с диска, хотя существует много свободных пространств? Это то, о чем я беспокоюсь. –

0

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

Другой альтернативный вариант - эмигрировать некоторый код в другой процесс. С помощью COM нетрудно начать и поддерживать, а сервер может быть 64-битным процессом, уклоняющимся от ограничения виртуального адреса. Я бы не ожидал более медленного замедления, чем с помощью дисковой идеи, и это определенно проще.

О да, мы пропустили первое: возможно, преобразование проекта в 64 бит решит проблему.

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

0

Если вы написали свои алгоритмы с использованием библиотеки C++, вы можете увидеть this вопрос и ответы на вопросы.

Я фактически использовал файлы с отображением памяти для обработки больших файлов данных (индексирование, сортировка, ленивое обновление), и я не счел это ни простым, ни эффективным.

Смежные вопросы