当前位置: 首页 > 知识库问答 >
问题:

在Java中,重复读取/写入大量int[](位集)数据到文件中可以快速完成吗?

何勇
2023-03-14

我的主程序如下所示(伪代码):

public void main(String[] args) {

    // produce lots of int[] data which is stored inside a list of hashmaps
    List<HashMap<Integer, int[]>> dataArray1 = new
                                    ArrayList<HashMap<Integer, int[]>>();
    ...

    // create a new list of data, similar to dataArray1
    // now we will write into dataArray2 and read from dataArray1
    List<HashMap<Integer, int[]>> dataArray2 = new
                                    ArrayList<HashMap<Integer, int[]>>();
    while (true) {
        if (exitCondition) break;
        ...
        for index1, index2 in a set of indices {
            int[] a1 = dataArray1.get(index1).get(key1);
            int[] a2 = dataArray1.get(index2).get(key2);
            int[] b = intersect a1 and a2;
            int i = generateIndex(index1, index2);
            int key = generateKey(key1, key2);
            dataArray2.get(i).put(key, b);
        }
    }

    // now we can remove dataArray1
    dataArray1 = null;

    // create a new list of data, similar to dataArray2
    // now we will write into dataArray3 and read from dataArray2
    List<HashMap<Integer, int[]>> dataArray3 = new
                                    ArrayList<HashMap<Integer, int[]>>();
    while (true) {
        if (exitCondition) break;
        ...
        for index1, index2 in a set of indices {
            int[] a1 = dataArray2.get(index1).get(key1);
            int[] a2 = dataArray2.get(index2).get(key2);
            int[] b = intersect a1 and a2;
            int i = generateIndex(index1, index2);
            int key = generateKey(key1, key2);
            dataArray3.get(i).put(key, b);
        }
    }

    // now we can remove dataArray2
    dataArray2 = null;

    ...
    // and so on 20 times

}

我的问题是,在某个点上,对于某些k

解决方案是使用数据库或文件系统。你建议用什么?我需要性能(时间执行),内存不重要。如果您的经验是数据库,那么请推荐处理特定问题的最快界面(哪个?)数据库,不管是bd4(Berkeley db)、postgresql还是其他什么。如果说文件系统,那么请推荐最快的接口(文件库)。

至于读写统计:在代码的每个while循环中,我的读写次数是写的3倍,例如:对于一个级别k,我从dataArray\u k读取12000次,然后写入dataArray\u(k 1)4000次。

我可以存储列表中的每个hashmap


共有2个答案

欧阳楚
2023-03-14

老实说,用Java阅读那么多数据可能会是一场噩梦。我只工作了5 GB的文本文件,这是非常缓慢和困难。您可以使用更接近操作系统的东西(sed、grep、fint等)。如果Java是A必须,那么我想NIO包会比简单的文件更快

看这儿

公冶泰
2023-03-14

昨天我评估了不同JavaIO/nio技术的读取性能。事实证明,在pc上,java提供的内存映射。nioIntBuffer的读取性能最好。代码细节:从二进制文件中读取大量int的最快方法

当然,事实也证明,算法变化在提高速度方面有更大的潜力。例如,在你的情况下,考虑多维搜索结构,如四叉树或R*树,以减少磁盘访问与sonehow密切相关的生物数据。

更新:正如我现在看到的代码,您似乎总是迭代所有值(这不是很清楚)。首先尝试使用一个短数组,它需要一半的空间。

 类似资料:
  • 本文向大家介绍asp.net实现Postgresql快速写入/读取大量数据实例,包括了asp.net实现Postgresql快速写入/读取大量数据实例的使用技巧和注意事项,需要的朋友参考一下 最近因为一些项目需要大量插入数据,研究了下asp.net实现Postgresql快速写入/读取大量数据,所以留个笔记 环境及测试 使用.net驱动npgsql连接post数据库。配置:win10 x64, i

  • 问题内容: 我必须在text [csv]文件中写入大量数据。我使用BufferedWriter写入数据,并且花费了大约40秒的时间来写入174 mb的数据。这是Java可以提供的最快速度吗? 注意:这40秒还包括从结果集中迭代和获取记录的时间。:) 174 mb用于结果集中的400000行。 问题答案: 你可以尝试删除BufferedWriter并直接使用FileWriter。在现代系统上,无论如

  • 问题内容: 我有包含以下格式的数字的文本文件: 现在,我需要读取该数据并将其分配给变量(前两个数字),并将其余所有数据( 1 000 000个 数字)分配给数组。 这不是一项艰巨的任务,但是-这太慢了。 我的第一次尝试是: 它按例外方式工作,但执行大约需要 7500毫秒 。我需要在几百毫秒内获取该数据。 然后我尝试了: 使用和我大约在 1700毫秒内 得到了相同的结果,但是仍然太多了。 如何在不到

  • 问题内容: 是否存在有关如何以一定速率读取长文件的文章/算法? 说我不想在发出读取数据时以每秒10 KB的速度通过。 问题答案: 粗略的解决方案是一次读取一个块,然后休眠,例如10k,然后休眠一秒钟。但是我要问的第一个问题是:为什么?有两个可能的答案: 您不希望创建工作比完成任务快。要么 您不想在系统上造成太大的负担。 我的建议是不要在读取级别上对其进行控制。这有点混乱和不准确。而是在工作结束时对

  • 我需要在文件中存储包含80000项的布尔数组。我不在乎节省多少时间,我只关心数组的加载时间。我没有尝试通过DataOutputStream存储它,因为它需要访问每个值。 我试图通过3种方法来做到这一点,例如: < li >序列化布尔数组 < li >使用BitSet代替布尔数组并将其序列化 < li >将布尔数组转换为字节数组,其中1为真,0为假,并使用ByteBuffer通过FileChanne

  • 问题内容: 我试图创建一个随机的实数,整数,字母数字,字母字符串,然后写入文件,直到文件大小达到 10MB 为止。 代码如下。 大约需要 225.953125秒 才能完成。如何提高此程序的速度?请提供一些代码见解? 问题答案: 观察到的“缓慢”的两个主要原因: 您的while循环很慢,大约有一百万次迭代。 您没有正确使用I / O缓冲。不要进行太多系统调用。目前,您正在拨打约一百万次。 首先在Py