Ethan
Ethan

Reputation: 485

Java OutOfMemoryError with ArrayList<List<Integer>>

I want to create a very large graph (with ~10 million edges) in Java. I plan to List<List<Integer>> to describe the edges, with the inside List<Integer> describing the two vertices of each edge (and the vertices are Integer type).

The following code throws the OutOfMemoryError after about 1 million edges are added to the graph. (I simplified how the edge is generated for the sake of discussion.)

public static void main(String[] args) {
  List<List<Integer>> graph = new ArrayList<List<Integer>>();
  for (int i = 0; i < 10000000; i++) {
    List<Integer> edge = new ArrayList<Integer>();
    // the real edges are more complicated (than from vertex i to vertex i+1)
    // this is simplified for the sake of the discussion here
    edge.add(i);
    edge.add(i+1);
    graph.add(edge);
  }
}

I have searched for OutOfMemoryError, and I have increased the initial heap size to 2G for Eclipse: -Xms2g -Xmx4g -Xss2m (which get passed to JVM). But that did not solve the problem.

Then I thought maybe I should garbage collect the List<Integer> edge variable, by calling System.gc(), in case its memory does not get cleared. That did not work either.

I was thinking maybe the problem is with the List<List<Integer>> data structure. I tried List<int[]>, which lasted a bit longer: more edges are added before OutOfMemoryError happens. I do not have a better idea right now.

I have searched around for similar problems, but have not find much help. I wonder if anyone has experience with this kind of situation.

Upvotes: 3

Views: 331

Answers (2)

dimm
dimm

Reputation: 1798

Since you are using a lot of RAM besides setting the max heap parameter, make sure you use 64-bit Java. The 32-bit is limited to 2 Gigs or something like that.

Also, for large graphs you should consider using a database.

And last but not least, maybe you can rethink your algorithm, sometimes you just don't need all the nodes and edges.

Upvotes: 0

Jeffrey
Jeffrey

Reputation: 44808

To let your program use more memory from Eclipse:

Go to Run -> Run Configurations. You will see this window Run Configurations

Click on Arguments Run Configurations/Arguments

Enter your arguments to the VM Run Configurations/Arguments/VM Arguments

Upvotes: 5

Related Questions