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

исключение нехватки памяти, вызванное большим массивом в java

Я реализую алгоритм, основанный на вероятностном скрытом семантическом индексировании (plsa), а статья здесь, и ему нужен четырехмерный массив с именем p_z_d_wt_wv, z – тема, d – документ, wt – текстовое слово, wv – визуальное слово, а число каждого измерения составляет около 12 7000 100. , 500, а массив представляет собой двойной массив, поэтому ему требуется 32 ГБ памяти!! Я выделяю эту память, как показано ниже, и это просто для демонстрации, так как количество wt и wv в каждом документе разное.

p_z_d_wt_wv = new double[12][7000][][]; 
for( int t = 0; t < 12; ++t) 
{ 
    for( int d = 0; d < 7000; ++d ) 
    { 
        p_z_d_wt_wv[t][d] = new double[100][500];
    } 
}

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

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

11.07.2013

Ответы:


1

Если вам действительно нужна вся эта память, ну, вам нужна вся эта память.

Есть несколько альтернатив:

  1. Вы можете изучить использование файлов с отображением памяти.

  2. Если в массиве много нулей, вы можете сохранить его как разреженное матричное представление (не сохраняйте нули явно).

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

11.07.2013
  • Спасибо за ваш ответ. Я исключил 0 из массива, я имею в виду, что храню только ненулевые значения. Поскольку я буду обновлять каждый элемент массива в цикле, то при таких условиях могу ли я сохранить его в файле или базе данных и как это сделать? еще один вопрос, почему моему коду не хватает памяти? Это потому, что у java есть предел памяти для последовательного массива? Спасибо 11.07.2013
  • Если вы собираетесь удалить нули, вам нужно будет изменить способ представления матрицы. Вам нужно будет использовать некоторые карты или другие структуры, предназначенные для этого. По умолчанию двойной массив хранит 0 для значения, поэтому, если вы выделите для него место, в нем все равно будет значение 0. Я предлагаю провести исследование представления разреженной матрицы. 11.07.2013
  • Что касается проблемы с памятью, то при запуске JVM она имеет фиксированный максимальный размер кучи. Вы можете изменить это, указав аргумент -Xmx. Например, если вы укажете -Xmx1G, куча будет равна 1 ГБ. Максимальный объем памяти, который может выделить процесс, зависит от операционной системы. 11.07.2013
  • Я настоятельно рекомендую использовать здесь float, если вам абсолютно не нужна небольшая дополнительная точность. 11.07.2013

  • 2

    Выделяется ли память последовательно, если массив выделяется моим способом? Это потому, что у java есть ограничение памяти для последовательной памяти? Если да, то каков предел?

    Нет, JVM не может выделить память для вашего массива. если вы используете float для своего массива, вы должны установить максимальное пространство кучи памяти 16 ГБ. Вы можете использовать файл для хранения массива.

    11.07.2013
  • хранить массив в одном файле? если да, то как читать и обновлять конкретный элемент массива и медленно ли это? Спасибо за совет. 12.07.2013
  • Я имею в виду несколько файлов. Думаю не медленно. Вы можете использовать RandomAccessFile для обновления вашего байта с высокой производительностью. 15.07.2013
  • Новые материалы

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

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

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

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

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

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

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