存储未来访问数据

时间:2012-08-13 16:00:55

标签: c arrays matrix

我有一些代码可以解析并从中提取一些矩阵。这些矩阵与某些标签相关联。

我想要做的是将这些矩阵与相关标签一起存储以备将来访问。所以基本上,我想创建一个文件/结构/数组/更新的东西,但我也可以调用矩阵操作,如果我需要在同一个运行中。此外,下次运行程序时,我应该能够调用到目前为止我已经重新编码的数组和标记。最后,我想要一个矩阵和标签数据库。

有人能指出我正确的方向开始吗?

非常感谢一些伪代码。

2 个答案:

答案 0 :(得分:1)

不确定我是否在回答您的问题,但如果您正在寻找用于读取/写入文件的C API来存储矢量,矩阵和其他排名数组(图像也是如此),您可以使用FITS文件格式。您可以标记存储的信息并执行其他操作。你可以在这里找到CFITSIO库和文档:http://heasarc.gsfc.nasa.gov/fitsio/(是的,NASA的东西;-))

从上面的页面:

CFITSIO is a library of C and Fortran subroutines for reading and 
writing data files in FITS (Flexible Image Transport System) data format. 
CFITSIO provides simple high-level routines for reading and writing FITS files 
that insulate the programmer from the internal complexities of the FITS format. 
CFITSIO also provides many advanced features for manipulating and filtering the
information in FITS files.

我使用FITS存储多维数组(直方图,图像......),以及不同数据类型的元素。这个库虽然有用,但您甚至可以通过使用特定过滤器打开文件来选择向量/矩阵:不要担心复杂的I / O,编码或解码例程。

答案 1 :(得分:0)

现在存储矩阵的结构类型(在内存中)是相关的。

例如,您可以使用诸如

之类的结构存储二维矩阵
struct {
    size_t w;
    size_t h;
    double **values;
    size_t n;
    char **tags;
}

然后将其写入磁盘,

fwrite(&(m->w), sizeof(size_t), 1, fp);
fwrite(&(m->h), sizeof(size_t), 1, fp);
for (y = 0; y < h; y++)
    fwrite(m->values[y], sizeof(double), m->w, fp);
fwrite(&(m->n), sizeof(size_t), 1, fp);
for (y = 0; y < m->n; y++)
{
    size_t len = strlen(m->tags[y]);
    fwrite(&len, sizeof(size_t), 1, fp);
    fwrite(m->tags[y], sizeof(char), len, fp);
}

并通过用freads替换fwrits重新读取:

if (1 != fread(&(m->w), sizeof(size_t), 1, fp))
    // ERROR
if (1 != fread(&(m->h), sizeof(size_t), 1, fp))
    // ERROR
if (NULL == (m->values = malloc(sizeof(double *) * m->h)))
    // ERROR: OUT OF MEMORY
for (y = 0; y < h; y++)
{
    if (NULL == (m->values[y] = malloc(sizeof(double) * m->w)))
        // OOM
    if (m->w != fread(m->values[y], sizeof(double), m->w, fp))
        // File truncated error
}
if (1 != fread(&(m->n), sizeof(size_t), 1, fp))
    // Truncated
for (y = 0; y < m->n; y++)
{
    size_t len;
    fread(&len, sizeof(size_t), 1, fp);
    if (NULL == (m->tags[y] = malloc(len + 1)))
        // OOM
    if (len != fread(m->tags[y], sizeof(char), len, fp))
        // Truncated
    m->tags[y][len] = 0x0; // C strings must be zero-terminated
}

...但这仅涵盖二维矩阵,并要求将每个矩阵存储到自己的文件中。

当然,您可能会进一步使系统复杂化并存储一个带有标题的单个“数据库”,内部有许多矩阵等等,然后将每个矩阵一个接一个地存储起来。

从长远来看,你最好还是检查一下Fud标准Claudix建议是否允许将矩阵序列化为字符串。如果他们这样做,你将能够将这些字符串存储到一个真正的数据库(PostgreSQL,MySQL,甚至SQLite3,这样你就不必拥有一个独立的服务器)。这也将允许您不必在每次更改标记时重写整个whopper,并且具有更多可维护的代码,代价是编写两个FITS包装函数,这些函数从内存对象转换为SQLited字段值,反之亦然。

如果FITS格式不允许变量标签与矩阵和向量相关联,则直接使用FITS可能会出现问题。

如果你无法调整FITS来写入字符串对象,你仍然可以使用上面的代码将矩阵对象的包装器写入字符串(例如通过base64编码生成的缓冲区)。一旦你将矩阵作为一个字符串对象,它就是那里的SQL:

INSERT INTO MatrixTable (matrixId, matrixEncoding) VALUES (...);
INSERT INTO MatrixTags (matrixId, tagName, tagValue) VALUES (2418, 'Taken', '2012-08-20 at noon');