Nano Hash - криптовалюты, майнинг, программирование

Ошибка: общий размер массива не должен превышать 0x7ffffffff байт.

У меня есть небольшая программа на С++, для которой требуется большой двумерный массив.

int distanceArray[282][9900000];

Я знаю, что стандартное 32-битное консольное приложение не сможет выделить столько памяти для моего процесса из-за ограничения в 2 ГБ для 32-битных приложений. Однако, несмотря на то, что я настроил свой компилятор на использование собственного набора инструментов amd64, я все равно получаю ту же ошибку, когда пытаюсь собрать свое приложение:

Error   C2148   total size of array must not exceed 0x7fffffff bytes

В моей системе 16 ГБ ОЗУ, поэтому я знаю, что моя физическая память не должна быть проблемой. Если мои расчеты верны, это должно занимать всего около 3 ГБ. Однако я не понимаю, почему я не могу заставить 64-битный компилятор работать правильно. Я следовал инструкциям на веб-сайте Microsoft, где описано, как использовать 64 битный компилятор, но независимо от того, что я делаю, я получаю ту же ошибку. Любая помощь будет принята с благодарностью. Благодарю вас!

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


  • Вероятно, вы переполняете свой стек. Это не то же самое, что общая доступная память процесса. Вместо этого используйте std::vector<std::vector<int>> или что-то в этом роде. 11.02.2017
  • Однако не вызовет ли это обычно ошибку во время выполнения? Я даже не могу заставить это скомпилировать правильно. 11.02.2017
  • Тогда это, похоже, специфика компилятора. Я не могу воспроизвести здесь . Вам, вероятно, следует добавить теги и пояснения о вашей конкретной среде разработки. 11.02.2017
  • В любом случае, если бы вы запустили его в этом состоянии, он, безусловно, чрезвычайно сильно переполнил бы стек. 11.02.2017
  • Вот почему используйте new[] для его выделения. 11.02.2017

Ответы:


1

64-битный исполняемый формат PECOFF, используемый в Windows, не поддерживает создание исполняемых файлов с размером загрузки более 2 ГБ, поэтому вы не можете создавать статически размещенные объекты большего размера. Вы столкнетесь с аналогичной проблемой, если попытаетесь создать такой объект в стеке, используя автоматически выделенный объект.

Одним из возможных решений было бы динамическое выделение объекта:

int (*distanceArray)[9900000] = (int (*)[9900000]) calloc(282, 9900000);

Или, если вы хотите, чтобы он был более С++, и вам не нужно, чтобы он был инициализирован нулем, как статически выделенный массив:

int (*distanceArray)[9900000] = new int[282][9900000];
11.02.2017
  • Ой, почему бы не предложить std::vector<std::vector<int>>. В конце концов, он помечен как C++. 11.02.2017
  • @MSalters Потому что мой пример почти точно такой же, как int distanceArray[282][9900000];, за исключением того, что он распределяется динамически, и поэтому его можно использовать в качестве замены в большинстве контекстов. Если вы хотите сделать его более похожим на С++, вы можете вместо этого использовать new[], в противном случае, не зная из вопроса, будет ли вектор векторов приемлемой альтернативой, я пошел на самую прямую замену. Кроме того, использование вектора векторов уже было предложено πάντα ῥεῖ, поэтому я буду повторять только то, о чем, как я предполагал, исходный постер уже знал. 11.02.2017
  • Есть еще одна вещь, определяющая максимально возможный массив. У вас не может быть массива, в котором индексы больше INT_MAX (см. <limits.h>). Динамический или статический. В С или С++. 16.09.2018

  • 2

    Как предложил MSalters, std::vector<std::vector<int>> определенно был правильным выбором.

    Для тех, у кого все еще есть эта проблема, вот как я ее инициализировал:

    std::vector<std::vector<int>> distanceArray(282, std::vector<int>(9000000, -1));
    

    В каждой строке из 282 элементов создается 9 000 000 столбцов, и каждое значение инициализируется равным -1 в начале.

    Спасибо всем, кто прокомментировал за помощь!

    11.02.2017
  • Использование вектора имеет другое поведение, чем то, о чем просили, или то, что было предоставлено в ответе, на который вы ссылались. 10.06.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..