Java 如何在一个ArrayList中提取数据,直到RAM不再';别累了

Java 如何在一个ArrayList中提取数据,直到RAM不再';别累了,java,arraylist,Java,Arraylist,我正在编写一个java函数。此函数的返回类型为ArrayList 当返回的ArrayList大约有100万个元素时,可能会出现这样的情况,它会穿过可用的RAM并抛出异常。 我该如何处理这种情况。我不希望代码因异常而中断。 是否有一种方法可以指定提取特定数量的元素,然后丢弃它们并处理接下来的几个元素…比如缓冲区大小? 下面是我正在做的代码: ArrayList<String> users = getUsers(); ... ... ... private ArrayList<

我正在编写一个java函数。此函数的返回类型为
ArrayList

当返回的
ArrayList
大约有100万个元素时,可能会出现这样的情况,它会穿过可用的RAM并抛出异常。
我该如何处理这种情况。我不希望代码因异常而中断。
是否有一种方法可以指定提取特定数量的元素,然后丢弃它们并处理接下来的几个元素…比如缓冲区大小?
下面是我正在做的代码:

ArrayList<String> users = getUsers(); 
...
...
...

private ArrayList<String> getUsers() throws Exception{
    //connect to MongoDB
    ArrayList<String> userList = new ArrayList<String>();
    userList = //get the list of users.
    return userList;
}
arraylistusers=getUsers();
...
...
...
私有ArrayList getUsers()引发异常{
//连接到MongoDB
ArrayList userList=新的ArrayList();
userList=//获取用户列表。
返回用户列表;
}
我在想,这不会导致行
arraylistusers=getUsers()如果返回的列表太大,当返回的列表超过可用内存限制时引发异常?

如何处理这种情况?

您可以尝试使用以下内容对数据进行分页:

db.userdetails.find().skip(1000).limit(100);

在上述场景中,您将跳过前10页,进入第11页。

您可以尝试使用以下内容对数据进行分页:

db.userdetails.find().skip(1000).limit(100);

在上面的场景中,您将跳过前10页,进入第11页。

有两种标准解决方案出现在脑海中:

1) 分页:向指定页码和页面大小的方法传递两个数字。在调用代码中,处理结果,然后使用下一个页码再次调用该方法:

private void processUsers() {
    int pageSize = 42;
    // the first page is page 1
    int page = 1;    
    List<String> users = getUsers(page, pageSize); 
    while(!users.isEmpty()) {        
        processPage(users);
        users = getPage(++page, pageSize); 
    }
}

private List<String> getPage(int page, int pageSize) {               
    int maxIndex = countTotalResults() - 1;
    int startIndex = Math.MIN((page - 1) * pageSize, maxIndex);
    int endIndex = Math.MIN(startIndex + pageSize, maxIndex);
    return listUsers(startIndex, endIndex);
}

我想到了两种标准解决方案:

1) 分页:向指定页码和页面大小的方法传递两个数字。在调用代码中,处理结果,然后使用下一个页码再次调用该方法:

private void processUsers() {
    int pageSize = 42;
    // the first page is page 1
    int page = 1;    
    List<String> users = getUsers(page, pageSize); 
    while(!users.isEmpty()) {        
        processPage(users);
        users = getPage(++page, pageSize); 
    }
}

private List<String> getPage(int page, int pageSize) {               
    int maxIndex = countTotalResults() - 1;
    int startIndex = Math.MIN((page - 1) * pageSize, maxIndex);
    int endIndex = Math.MIN(startIndex + pageSize, maxIndex);
    return listUsers(startIndex, endIndex);
}

您可以为ArrayList构造函数提供足够大的容量,这样就不会将旧数组复制到更大的新数组中。这种方法可能会有所不同,使用字节映射内存,也可能使用GZippedOutputStream中包装的ByteArrayOutputStream。您可以为ArrayList构造函数提供足够大的容量,这样就不会将旧数组复制到更大的新数组。方法可能会有所不同,使用字节映射内存,可能使用包装在gzip输出流中的ByteArrayOutputStream。我将尝试这些并让您知道结果:)我将尝试这些并让您知道结果:)我将尝试这个并让您知道我得到了什么:)我将尝试这个并让您知道我得到了什么:)