c++ - 创建包含大数据的共享库的最佳实践

标签 c++ shared-libraries conventions

我创建了一个动态 C++ 库,它依赖于大约 30 MB 或更多的数据。现在我正在尝试找出存储该数据的最佳方式。

数据本质上是一个拥有超过百万个元素的大数组。

我希望库的安装/卸载尽可能简单。该库可以被终端程序、R程序等其他接口(interface)程序引用,只需要支持UNIX

我的一个想法是将数据硬编码到一个大数组中,然后将文件编译到库中,但这似乎不是正确或有效的做事方式。另外,如果我使文件超过 1 GB,那么事情就会失控。

我的另一个做法是将包含数据的文件复制到预定义的路径,并将库中的引用硬编码到该路径。但是,有些用户不想将所有内容都安装到默认安装路径。

我的另一个想法是让每个接口(interface)都有能力提供数据文件的路径,但这对接口(interface)来说似乎很麻烦,接口(interface)为什么要知道库数据在哪里?

对于这种情况有什么众所周知的做法吗?

最佳答案

我认为对此没有一个“正确”的答案。

在文件中存储数据是可以的,只要数据的更改频率不超过您希望发布新库的频率 - 无论如何您都需要某种方式的存储量,所以只要编译器将数据存储在共享库中并没有做得很糟糕,据我所知,它并不比任何其他选项差。

仅当您希望数据的更改频率高于您希望发布新共享库的频率时,拥有辅助文件才有用。它增加了打开和读取辅助文件的额外复杂性 - 缺点是您还需要添加检查它是否正确/存在以及处理它的代码不存在。

如果您确实有一个辅助文件,那么有一些方法来重新定义位置肯定是有益的。

如果数据非常大,您可能需要使用压缩格式。您仍然可以将压缩数据存储为共享库中的数据,并使用可以从中扩展数据的压缩库。或者您可以使用从外部文件读取的库...

最后,它真正归结为:

  1. 您如何使用数据 - 您是始终需要所有数据,还是有时只需要其中的一部分?如果是后者,您怎么知道哪些位?
  2. 数据更改的频率。
  3. 数据是否可以压缩,如果可以,你用什么方法压缩它?

我不确定共享库是否有任何直接的大小限制 - 如果您需要 1GB 的数据,那么无论哪种方式,您都需要 1GB 的内存空间,所以这不像是在节省内存 [假设您总是需要所有数据和/或无法确定您需要哪些部分]。

关于c++ - 创建包含大数据的共享库的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21973227/

相关文章:

c++ - 谁能帮我解决这个程序的问题(它使用指针转置矩阵)

c++ - 如何在 C++ 中比较两个非随机访问迭代器

C++ 对象实例化

go - Flutter,在预构建的 GO .so 库上使用 DynamicLibrary.open(),无需编写 Native Code(Java/Swift)

ios - 注销/清除数据的 Objective-C 约定是什么?

c++ - 如何仅将矩阵的一维分配给 C++ 中的简单数组

linux - 如何在 Linux 中存储不同编译的相同库版本?

silverlight - 如何在 Caliburn Micro 中捕获组合框选择?

ios - 库 API 的 Objective-C 类前缀

Java EE 共享库?