2012-01-23 6 views
1

Я только начал работать над проектом (я новый, а не проект), который в качестве оптимизации производительности загружает 32 ГБ данных графа (узлы, ребра и т. Д.) В память и сохраняет их там. Это длинная служба, поэтому данные должны оставаться в памяти на протяжении всей службы службы. Когда коллекция Gen 2 запускается CLR, есть большие паузы (конечно), которые ухудшают производительность, в то время как GC сканирует Gen 2, отмечая все как достижимые объекты.GC-паузы, вызывающие проблемы с производительностью

Что я хотел бы знать, существуют ли стратегии для управляемых приложений, которые должны хранить большие объемы данных в памяти? Каковы наилучшие способы предотвратить запуск коллекций Gen 2?

+0

Если вы * никогда не запустили Gen 2, вы бы пропустили объекты, которые превращают его в Gen 2, но не * сохраняются в живых навсегда. В зависимости от того, что делает ваше приложение, это может быть много объектов. – delnan

+0

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

+0

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

ответ

1

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

class Graph { 
    List<Node> roots; 
    // ... 
} 

class Node { 
    Node[] outwardEdges; 
    // ... 
} 

С косвенными ссылками через идентификаторы узлов:

class Graph { 
    List<Node> roots; 
    Node[] allNodes; 
    // ... 
} 

class Node { 
    int[] outwardEdges; 
    // ... 
} 

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

Перенос данных на нативную кучу - это еще одна возможность, написав небольшую библиотеку JNI, чтобы предоставить вам интерфейс для выполнения необходимых операций. Это может окупиться другими способами: в прошлый раз, когда у меня была схожая проблема, мы решили сделать экономию пространства с помощью этого подхода, потому что у нас были в основном западные текстовые данные в наборе данных, которые занимали гораздо меньше пространства, закодированного как UTF8. Пока стоимость поиска по графику нетривиальна, накладные расходы на собственный вызов вряд ли будут проблемой.

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