题
在数据库(例如 hsqldb)中存储大型数组(10000x100)的最有效方法是什么?我需要为我用 java 编写的某个数学程序执行此操作。请帮忙。整个数组将被经常检索和存储(而不是单个元素)。此外,还需要存储一些关于数组的元数据。
解决方案
很棒的问题。
除非你想将数组翻译成一组规范化的表,听起来你没有,你可能想要考虑序列化。
序列化是一种奇特的词汇,用于将对象转换为可以保存到磁盘或数据库的某种格式。序列化的两种主要格式是二进制和XML,我敢打赌Java有一些支持。
根据您使用的数据类型,您应该能够将数组转换为XML或二进制文件,然后将其保存到数据库中的单个字段中。您可以通过查看 http://java.sun来开始使用Java中的这种技术。 COM /开发商/ technicalArticles /编程/系列化/ 。我知道它内置于.NET中。
希望这会有所帮助。如果我能给你更多指导,请告诉我。
其他提示
如何将数据存储为BLOB并使用Java将BLOB解码为实际的Java数组?在一个存储器中存储和检索整个阵列会更有效,但是对于单个元素的繁琐会很糟糕。
想出一个内部表示 - 无论是XML,JSON,你自己想出的二进制文件,还是任何其他形式的序列化。
使用“blob”将其存储在表格中数据类型。将与矩阵关联的任何元数据存储在其他列中。
我强烈不同意这样做的方法是创建一个与矩阵具有相同行数和列数的表格 - 这对于您不使用的功能来说是一个非常高的代价。
事先准备你的insert / select语句,并使用绑定变量来改变你正在使用的矩阵 - 不要让db重新分析每个请求。
如果它只是1个数组,为什么不使用二进制文件?
正如已经建议的那样:如果您不需要这些功能,请不要使用RDBMS。虽然您可能希望对像 JDBM 这样的低级API进行协调而不是序列化,但它提供了一些数据库之类的功能,例如管理磁盘索引。
如果您的数据密集(值直方图接近扁平线),您最好的选择是使用对象[输出/输入]流进行blob和序列化。
否则,您可能会发现使用稀疏数组和实体 - 属性 - 值模式的变体更有效。这是一个例子:
Name | IndexKey | Value
------+-----------+-------
foo | 'default' | 39
foo | 0:0:0 | 23
foo | 0:0:1 | 34
foo | 1:5:0 | 12
...
bar | 1:3:8 | 20
bar | 1:3:8 | 23
bar | 1:1:1 | 24
bar | 3:0:6 | 54
...
这也允许您快速更新表的某些部分,并使用SQL'like'运算符选择切片。
如果修改维度的数量以分解键列以分隔每个维度的int列,以提高索引效率并具有更灵活的选择条件(您可以使用第一个索引'null'作为元数据,如默认值)。
在任何情况下,最好在Name,IndexKey列上创建聚簇索引。
使用数组所包含的数据定义一个表,并将数组值插入表中。
这是非常简单的数据访问/存储。您的阵列尺寸是否始终相同?
- 在一笔大的显式事务中执行此操作。不要强制数据库系统为每次插入创建新的隐式事务。
- 使用准备好的语句。
PostgreSQL内置了对阵列的支持。
将Java序列化为存储为BLOB的字节数组将是您最好的选择。 Java将非常有效地序列化大型数组。将剩下的行列用于您有兴趣查询或显示的任何内容。将BLOB保存在他们自己的表中并且具有“常规”表格也是一个好主意。行指向“BLOB”。行,如果您查询并报告非BLOB数据(尽管这可能因数据库实现而异)。
HSQLDB 2.0支持存储为表格列的一维数组。因此,表格的每一行都对应于2D数组的一行。
但是如果你想整体地检索2D数组,BLOB是最好的解决方案。