带有 fstream 或数据库的 C++

Posted

技术标签:

【中文标题】带有 fstream 或数据库的 C++【英文标题】:C++ with fstream or database 【发布时间】:2010-03-11 14:06:26 【问题描述】:

我正在尝试用 C++ 实现图像识别程序。

我已经完成了特征的提取,现在正在尝试保存大量的数字。我想到了两种实现方式,一种是将数据保存到二进制文件中,以减少计算开销,或者我可以使用数据库来保存信息。

二进制文件读写速度很快,但很难访问,而数据库似乎是一个更容易使用的接口,但我不确定性能是否足够快。

你们有任何关于 fsream 或数据库作为快速持久存储选择的经验吗?

【问题讨论】:

你的数据是什么格式的,请提供样本。 目前每个数据大约是809维的双数组,可能有上千个这样的数据集需要检索。我只是意识到可能有超过 1 个线程访问该文件以及.. Emm, 【参考方案1】:

您可以使用SQLite。它基本上提供了对本地文件的数据库样式访问。你也可以用它创建内存数据库,但我不知道是否可以持久化。

此外,这里的最佳选择很大程度上取决于您的访问模式。如果只是顺序写入和顺序读取,那么二进制文件是最好的解决方案。

【讨论】:

【参考方案2】:

如果您真的想要速度,请考虑使用 C 风格的 I/O 函数,例如 fopen(0, fread() 等。出于多种原因,这些函数通常比 iostream 快得多。

【讨论】:

感谢您的快速响应。打算试试 fread 的实现,看看什么时候读写。 @Yijinsei 在你使用的时候,也可以试试非标准的 open() 和 write() 函数。【参考方案3】:

对我来说,使用像 SQLite 这样的数据库的优势是我的数据的独立格式以及使用 SQL 查询数据的能力。

事实证明,将数据写入 SQLite 数据库比将数据写入简单的 CSV 文本文件要慢得多。

这取决于您以后想对数据做什么?如果您只是想再次阅读并做一些事情,请按照建议使用 fstream(或 C 样式 I/O)。如果你想查询数据并且只获取特定数据,请使用 SQLite。

您还必须考虑如何将数据存储在数据库中。如果您要将数据存储为 BLOB,最终可能会失去 SQL 的优势并牺牲性能。

【讨论】:

在我完成图像提取并保存后。我需要使用回数据进行比较,每个查询可能有数千次访问。所以我真的需要一个快速的方法【参考方案4】:

我正在用 C++ 编写一个音频识别程序,我现在正在使用 PostgreSql 进行数据存储。所以我也对答案感兴趣:)。 我可以建议的是,数据存储应该根据识别算法来选择。如果您将图像与保存的图像一一比较,那么二进制文件似乎更快。但如果在识别过程中同时处理多张图像,数据库可能是更快速的解决方案。

【讨论】:

以上是关于带有 fstream 或数据库的 C++的主要内容,如果未能解决你的问题,请参考以下文章

<fstream> 与 <fstream.h> 分别在啥情况下使用?

C++文件读写详解(ofstream,ifstream,fstream)

C++,fstream 对象作为引用传递给函数,常量?

即使使用 ios::app 在 C++ 中覆盖 Fstream

#include<fstream>在C++中是啥作用?

c++中如何用函数传递fstream类型