diff --git a/java/src/main/java/org/softwareheritage/graph/utils/PopularContents.java b/java/src/main/java/org/softwareheritage/graph/utils/PopularContents.java
index 58660f027a93f3f0f5810e96bd0192e2c9beea56..5eac1fe9d9de9e548407e4e47b9fd70077a1e2a9 100644
--- a/java/src/main/java/org/softwareheritage/graph/utils/PopularContents.java
+++ b/java/src/main/java/org/softwareheritage/graph/utils/PopularContents.java
@@ -37,6 +37,10 @@ import org.slf4j.LoggerFactory;
 
 public class PopularContents {
     private SwhBidirectionalGraph graph;
+    /*
+     * A copy of the graph for each thread to reuse between calls to processChunk
+     */
+    private ThreadLocal<SwhBidirectionalGraph> threadGraph;
     private int NUM_THREADS = 96;
 
     final static Logger logger = LoggerFactory.getLogger(PopularContents.class);
@@ -52,6 +56,7 @@ public class PopularContents {
         long popularityThreshold = Long.parseLong(args[2]);
 
         PopularContents popular_contents = new PopularContents();
+        popular_contents.threadGraph = new ThreadLocal<SwhBidirectionalGraph>();
 
         popular_contents.loadGraph(graphPath);
 
@@ -70,7 +75,7 @@ public class PopularContents {
         System.out.format("SWHID,length,filename,occurrences\n");
 
         long totalNodes = graph.numNodes();
-        long numChunks = NUM_THREADS * 10000;
+        long numChunks = NUM_THREADS * 1000;
 
         ProgressLogger pl = new ProgressLogger(logger);
         pl.itemsName = "nodes";
@@ -94,9 +99,13 @@ public class PopularContents {
 
     private void processChunk(long numChunks, long chunkId, int maxResults, long popularityThreshold,
             ProgressLogger pl) {
+        if (threadGraph.get() == null) {
+            threadGraph.set(this.graph.copy());
+        }
+        SwhBidirectionalGraph graph = threadGraph.get();
         long totalNodes = graph.numNodes();
         HashMap<Long, Long> names = new HashMap<>();
-        SwhUnidirectionalGraph backwardGraph = graph.getBackwardGraph().copy();
+        SwhUnidirectionalGraph backwardGraph = graph.getBackwardGraph();
 
         long chunkSize = totalNodes / numChunks;
         long chunkStart = chunkSize * chunkId;