управление памятью Java

Если вы не укажете его с помощью group_by, поведение по умолчанию будет суммировать и включать только то, что вы указали в summarize, поэтому в вашем коде столбец c не существует. Если вы укажете его как группу, этот столбец будет включен.

library(dplyr)

df <- data.frame(a=1:100, b=1:100, c='categorical')

df %>%
  group_by(c) %>% 
  summarise(new_a=sum(a), new_b=sum(b)) %>% select(new_a, new_b, c)

#> # A tibble: 1 x 3
#>   new_a new_b c          
#>           
#> 1  5050  5050 categorical

Создано в 2019-01-18 с помощью пакета представитель (v0.2.1) sup>

5
задан Cœur 15 August 2017 в 05:39
поделиться

6 ответов

Я не вижу ничего очевидно неуместного. Если Вы работаете с очень большой базой данных, Вы могли бы попытаться увеличить свой размер "кучи" при помощи -Xmx n опция в Вашем вызове JVM. Это обычно не, лучшее решение - только делает с этим, когда Вы знаете, что Ваш размер рабочего набора на самом деле больше, чем размер "кучи" по умолчанию.

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

3
ответ дан 14 December 2019 в 01:20
поделиться

Попробуйте память SAP анализатор.

https://www.sdn.sap.com/irj/sdn/wiki? путь =/display/Java/Java+Memory+Analysis

Это читает в файле дампа и позволяет Вам исследовать то, что поднимает память.

2
ответ дан 14 December 2019 в 01:20
поделиться

Хорошо...

Большой опыт с Java и базами данных (оракул в качестве примера различия postpostgresSQL mysql>) учил меня, что драйверы JDBC, которые мы используем в выполнении этой работы часто, имеют проблемы.

У меня есть одна часть кода, который должен остаться связанным с базой данных 24/7, и из-за утечки памяти драйвера JVM всегда дросселировала бы в какой-то момент. Так, я написал код, чтобы поймать определенное выданное исключение и затем принять когда-либо все больше радикальные меры, включая отбрасывание соединения и повторное подключение и даже перезапуск JVM в отчаянном, ничто не работает для очистки проблемного обстоятельства. Какая БОЛЬ для записи этого но это работало, пока поставщик DBMS не выпустил новый драйвер JDBC, который не вызвал проблему... Я на самом деле просто оставил код на месте на всякий случай!

... Так, это могло быть ничто, что Вы делаете.

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

Кроме того, это не может быть ясно, но ResultSets поддерживают продолжающееся соединение с самим механизмом базы данных, во многих случаях (если явно не установлено иначе) двунаправленный, даже если Вы просто читаете. И, некоторые драйверы JDBC позволяют Вам попросить однонаправленное соединение, но лгать и возвратить двунаправленное! Остерегайтесь с этим!

Так, это - хорошая практика для разгрузки объектов ResultSet в другие объекты содержать значения и отбросить сами объекты ResultSet как можно скорее.

Удачи. RTIII

2
ответ дан 14 December 2019 в 01:20
поделиться

Сколько объектов находится в Вашем наборе результатов? Если существует достаточно записей, чем Вы израсходуете всю свою память, поскольку нет ничего, собрал "мусор" в этом случае, поскольку Вы делаете addDocument устройству записи, которое будет держать ссылку на все документы, которые Вы создаете.

0
ответ дан 14 December 2019 в 01:20
поделиться

Вероятно, у Вас заканчивается пространство для Постоянного Поколения. Проверьте, содержит ли Ваше отслеживание стека что-то как java.lang. OutOfMemoryError: PermGen

Можно увеличить пространство для этого поколения с этим параметром для jvm:-XX:MaxPermSize=128m

Объекты в постоянном поколении не рассматривают во время сборки "мусора". Смотрите на эту страницу от солнца для получения дополнительной информации о сборке "мусора" и различных поколениях объектов в JVM.

2
ответ дан 14 December 2019 в 01:20
поделиться

Java поддерживает несколько различных пулов памяти, и исчерпывающий любого из них может вызвать страшный OutOfMermoryException. Проблемы, выделяющие память Операционной системой, могут также проявить как OOM.

Необходимо видеть подробное отслеживание стека - или возможно ошибочный файл дампа в каталоге приложения - который может дать дальнейший ключ к разгадке относительно проблемы.

Если Вы используете достойного профилировщика - JVisualVM, который поставлется с недавним Sun Java 6 JDKs, вероятно, достаточно - можно наблюдать все различные пулы и видеть, которые заканчиваются.

0
ответ дан 14 December 2019 в 01:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: