Если вы не укажете его с помощью 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>
Я не вижу ничего очевидно неуместного. Если Вы работаете с очень большой базой данных, Вы могли бы попытаться увеличить свой размер "кучи" при помощи -Xmx n
опция в Вашем вызове JVM. Это обычно не, лучшее решение - только делает с этим, когда Вы знаете, что Ваш размер рабочего набора на самом деле больше, чем размер "кучи" по умолчанию.
Вы используете какие-либо сложные структуры данных? Если у Вас есть циклические ссылки между объектами, Вы могли бы препятствовать тому, чтобы сборщик "мусора" очистил недостижимые объекты. Если у Вас есть какие-либо рукописные структуры данных, удостоверьтесь, что Вы явно пустой ссылки на объекты, которые удалены вместо того, чтобы делать что-то как постепенное уменьшение переменной размера.
Попробуйте память SAP анализатор.
https://www.sdn.sap.com/irj/sdn/wiki? путь =/display/Java/Java+Memory+Analysis
Это читает в файле дампа и позволяет Вам исследовать то, что поднимает память.
Хорошо...
Большой опыт с Java и базами данных (оракул в качестве примера различия postpostgresSQL mysql>) учил меня, что драйверы JDBC, которые мы используем в выполнении этой работы часто, имеют проблемы.
У меня есть одна часть кода, который должен остаться связанным с базой данных 24/7, и из-за утечки памяти драйвера JVM всегда дросселировала бы в какой-то момент. Так, я написал код, чтобы поймать определенное выданное исключение и затем принять когда-либо все больше радикальные меры, включая отбрасывание соединения и повторное подключение и даже перезапуск JVM в отчаянном, ничто не работает для очистки проблемного обстоятельства. Какая БОЛЬ для записи этого но это работало, пока поставщик DBMS не выпустил новый драйвер JDBC, который не вызвал проблему... Я на самом деле просто оставил код на месте на всякий случай!
... Так, это могло быть ничто, что Вы делаете.
Обратите внимание, что вызов сборщика "мусора" был одной из стратегий, которые я использовал, но метрики показали, что он редко помогал.
Кроме того, это не может быть ясно, но ResultSets поддерживают продолжающееся соединение с самим механизмом базы данных, во многих случаях (если явно не установлено иначе) двунаправленный, даже если Вы просто читаете. И, некоторые драйверы JDBC позволяют Вам попросить однонаправленное соединение, но лгать и возвратить двунаправленное! Остерегайтесь с этим!
Так, это - хорошая практика для разгрузки объектов ResultSet в другие объекты содержать значения и отбросить сами объекты ResultSet как можно скорее.
Удачи. RTIII
Сколько объектов находится в Вашем наборе результатов? Если существует достаточно записей, чем Вы израсходуете всю свою память, поскольку нет ничего, собрал "мусор" в этом случае, поскольку Вы делаете addDocument устройству записи, которое будет держать ссылку на все документы, которые Вы создаете.
Вероятно, у Вас заканчивается пространство для Постоянного Поколения. Проверьте, содержит ли Ваше отслеживание стека что-то как java.lang. OutOfMemoryError: PermGen
Можно увеличить пространство для этого поколения с этим параметром для jvm:-XX:MaxPermSize=128m
Объекты в постоянном поколении не рассматривают во время сборки "мусора". Смотрите на эту страницу от солнца для получения дополнительной информации о сборке "мусора" и различных поколениях объектов в JVM.
Java поддерживает несколько различных пулов памяти, и исчерпывающий любого из них может вызвать страшный OutOfMermoryException. Проблемы, выделяющие память Операционной системой, могут также проявить как OOM.
Необходимо видеть подробное отслеживание стека - или возможно ошибочный файл дампа в каталоге приложения - который может дать дальнейший ключ к разгадке относительно проблемы.
Если Вы используете достойного профилировщика - JVisualVM, который поставлется с недавним Sun Java 6 JDKs, вероятно, достаточно - можно наблюдать все различные пулы и видеть, которые заканчиваются.