在数据库中存储大型数组(10000x100)的最有效方法是什么,比如 hsqldb?我需要为我用 java 编写的某个数学程序执行此操作。请帮忙。将经常检索和存储整个数组(而不是单独的元素)。此外,需要存储有关数组的一些元数据。
11 回答
好问题。
除非您想将数组转换为一组规范化表(听起来您不想这样做),否则您可能需要考虑序列化。
序列化是一个花哨的词,用于将对象转换为可以保存到磁盘或数据库的某种格式。序列化的两种主要格式是二进制和 XML,我敢打赌 Java 对它有一些支持。
根据您使用的数据类型,您应该能够将数组转换为 XML 或二进制,然后将其保存到数据库中的单个字段中。您可以通过查看http://java.sun.com/developer/technicalArticles/Programming/serialization/在 Java 中开始使用这种技术。我知道它内置于 .NET 中。
希望这会有所帮助。让我知道我是否可以给你更多的方向。
如何将数据存储为 BLOB 并使用 Java 将 BLOB 解码为实际的 Java 数组?在一次 gulp 中存储和检索整个数组会更有效,但对于摆弄单个元素来说会很糟糕。
提出一种内部表示形式——无论是 XML、JSON、您自己提出的一些二进制文件,还是任何其他形式的序列化。
使用“blob”数据类型将其存储在表中。将与矩阵关联的任何元数据存储在附加列中。
我强烈不同意这样做的方法是创建一个与矩阵具有相同行数和列数的表——这是为你不使用的功能付出的高昂代价。
事先准备好你的插入/选择语句,并使用绑定变量来改变你正在使用的矩阵——不要让数据库重新解析每个请求。
如果它只有 1 个数组,为什么不使用二进制文件?
正如已经建议的那样:如果您不需要这些功能,请不要使用 RDBMS。尽管您可能想要考虑像JDBM这样的低级 API,而不是序列化,它提供了一些类似数据库的功能,例如管理磁盘索引。
如果您的数据密集(值直方图接近平线),您最好的选择是使用 Object[Output/Input]Stream 进行 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 支持将一维数组存储为表的列。所以表格的每一行将对应二维数组的一行。
但是如果你想检索一个整体的二维数组,BLOB 是最好的解决方案。