Java 将阵列保存到硬盘

Java 将阵列保存到硬盘,java,arrays,Java,Arrays,我写了一个程序,使用了200万个整数值数组。但是,它一次只使用200个数组。 我有200辆智能车,它们可以在10000个街区的地形上行驶,根据GPS值划分。每个块都有一个包含整数值的129x28数组。当任何汽车驶入新的区块时,它必须检索与该区块相关的数组,然后使用该数组中的值。然后它根据这个值做出决定,然后继续前进,以此类推。因此,整个系统由200辆车和10000个块组成,而每辆车都有自己的数组不同的值,数组的总数是200万。我只需要在一个时隙中检索每辆车的1个数组=一次检索200个数组 应用程

我写了一个程序,使用了200万个整数值数组。但是,它一次只使用200个数组。 我有200辆智能车,它们可以在10000个街区的地形上行驶,根据GPS值划分。每个块都有一个包含整数值的129x28数组。当任何汽车驶入新的区块时,它必须检索与该区块相关的数组,然后使用该数组中的值。然后它根据这个值做出决定,然后继续前进,以此类推。因此,整个系统由200辆车和10000个块组成,而每辆车都有自己的数组不同的值,数组的总数是200万。我只需要在一个时隙中检索每辆车的1个数组=一次检索200个数组

应用程序将在开始时创建数组并用零填充,然后应用程序将开始填充这些数组,最后只使用它们。所以我写了一段代码在程序中创建这些数组

我不能将阵列存储在HD上的文件中,并在需要时检索它们吗

使现代化 由于我有200万个阵列,无法在1-1.9秒内存储和检索200个阵列,因此我降低了研究级别,减少了环境功能,最终使用了200万个大小为7 x 28的阵列。它使用了7*28*10000*4整数*200字节
如果使用RAM,则仅消耗1.6 GB。如果您遇到类似的问题,祝您好运,如果您遇到类似的情况,请PM,我希望我能提供帮助。

您是否考虑过使用类似的解决方案?即使是逗号分隔的文本文件,也可以在磁盘上使用Excel。您的数据源到底是什么?

您考虑过使用?即使是逗号分隔的文本文件,也可以在磁盘上使用Excel。数据源到底是什么?

一个相当简单的解决方案是使用ObjectOutputStream和ObjectInputStream类来写入和读取数组

下面是一些将阵列写入磁盘的示例代码:

    int [][] array = new int [129] [28];
    // fill in your array here
    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(fileName));
    out.writeObject(array);
    out.close();
下面是一些从磁盘读取以前保存的阵列的示例代码:

    ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName));
    int [] [] inArray = (int [] []) in.readObject();
    in.close();

一个相当简单的解决方案是使用ObjectOutputStream和ObjectInputStream类来编写和读取数组

下面是一些将阵列写入磁盘的示例代码:

    int [][] array = new int [129] [28];
    // fill in your array here
    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(fileName));
    out.writeObject(array);
    out.close();
下面是一些从磁盘读取以前保存的阵列的示例代码:

    ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName));
    int [] [] inArray = (int [] []) in.readObject();
    in.close();

数据从何而来?这不是200万个数组,而是大小为129x28的10000个块表,200辆车可以查看。我希望您正在做一些事情来加快查找块的速度—希望您可以使用hashmap。我更关心你的“积木”——你确定表结构是最好的用途吗?有些东西让我觉得“关闭”。@X-Zero:10000个街区,200辆车,每个街区都有一个阵列129x28的唯一副本。200*10000=200 000个阵列。至于搜索,我有二进制搜索,它需要花费log10 0000=O14来查找要检索的数组,并使用常数时间O15来检索检索到的数组中的精确值。我甚至在考虑使用数组的RAM容量的同时,我的代码中的缺陷是我没有考虑到我不使用的数组,后来我发现,即使那些数组也将驻留在RAM上。我假设一个单独的地形块对于每一辆车都是一样的。因此,允许它们共享对同一对象的引用。毕竟,汽车通常不会立即对地形造成明显影响。数据来自哪里?这不是200万个阵列,而是10000个大小为129x28的块表,200辆汽车可以查看。我希望您正在做一些事情来加快查找块的速度—希望您可以使用hashmap。我更关心你的“积木”——你确定表结构是最好的用途吗?有些东西让我觉得“关闭”。@X-Zero:10000个街区,200辆车,每个街区都有一个阵列129x28的唯一副本。200*10000=200 000个阵列。至于搜索,我有二进制搜索,它需要花费log10 0000=O14来查找要检索的数组,并使用常数时间O15来检索检索到的数组中的精确值。我甚至在考虑使用数组的RAM容量的同时,我的代码中的缺陷是我没有考虑到我不使用的数组,后来我发现,即使那些数组也将驻留在RAM上。我假设一个单独的地形块对于每一辆车都是一样的。因此,允许它们共享对同一对象的引用。毕竟,汽车通常不会立即对地形造成明显影响。根据AI汽车项目的某些事件,程序启动时将填充的整数。因此数组的值将在0-200之间。以文本形式存储将不必要地增加存储大小和检索时间,并可能使随机访问变得棘手。@Oli C。你认为我应该建立一个数据库吗?你知道从HD检索文件需要多长时间吗?@OliCharlesworth可能会,也可能不会。他的re
要求有点模糊。一个有数百万行的数据库是相当标准的。@AmirAfghani:29GB已经相当大了,假设为4字节int,我看不出DB在这里有什么帮助。但你是对的,OP没有给出足够的细节。整数,程序启动时将根据一些事件AI car项目填充。因此数组的值将在0-200之间。以文本形式存储将不必要地增加存储大小和检索时间,并可能使随机访问变得棘手。@Oli C。你认为我应该建立一个数据库吗?你知道从HD检索文件需要多长时间吗?@OliCharlesworth可能会,也可能不会。他的要求有点含糊。一个有数百万行的数据库是相当标准的。@AmirAfghani:29GB已经相当大了,假设为4字节int,我看不出DB在这里有什么帮助。但是你说得对,OP没有提供足够的细节。谢谢。但是没有自动生成文件名。我的意思是,我需要命名将数组保存在200万个数组中的文件=200万个文件。那么,是否可以自动命名文件以保存每个阵列呢?这里有一个解决方案。有200辆车,每辆车行驶10000多个街区。因此,您可以为每辆车设置一个单独的子目录,并在每个子目录中存储10000个文件。例如,/carfiles/car99/block250.dat将包含car 99 block 250的数据。继续上面的注释。但是,对于200万个阵列,数据库建议是一个很好的建议。使用包含数据的BLOB二进制大对象,设置一个按车号和块号索引的表。您可以使用上面的我的对象流代码,结合ByteArrayOutputStream和ByteArrayInputStream,而不是FileOutputStream和FileInputStream,向存储在BLOB中的字节数组写入/读取数据。谢谢。但是没有自动生成文件名。我的意思是,我需要命名将数组保存在200万个数组中的文件=200万个文件。那么,是否可以自动命名文件以保存每个阵列呢?这里有一个解决方案。有200辆车,每辆车行驶10000多个街区。因此,您可以为每辆车设置一个单独的子目录,并在每个子目录中存储10000个文件。例如,/carfiles/car99/block250.dat将包含car 99 block 250的数据。继续上面的注释。但是,对于200万个阵列,数据库建议是一个很好的建议。使用包含数据的BLOB二进制大对象,设置一个按车号和块号索引的表。您可以使用上面的我的对象流代码,与ByteArrayOutputStream和ByteArrayInputStream(而不是FileOutputStream和FileInputStream)结合使用,向存储在BLOB中的字节数组写入/读取数据。