【问题标题】:Best practice to create Shared library packed with big data创建包含大数据的共享库的最佳实践
【发布时间】:2014-02-23 19:17:57
【问题描述】:

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

数据本质上是一个包含数百万个元素的大数组。

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

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

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

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

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

【问题讨论】:

  • 您确实可以选择使用内存映射文件。如果只需要访问部分数据,可能会更有益。
  • 我可以使用它,但首先我需要将信息存储在某个地方。这就是我当前的问题是关于

标签: c++ shared-libraries conventions


【解决方案1】:

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

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

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

如果您确实有辅助文件,那么通过某种方式重新定义位置肯定会有所帮助。

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

最后真的归结为:

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

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

【讨论】:

  • 好的,谢谢。我将尝试用库编译数据——这很快给我带来了一个问题。堆栈对我来说太小了,你不能用预定义的值定义向量或堆数组。看到我有数千个值,我只想做一些类似 int[] pValues = {5, .. , 10} 的事情。关于我如何做到这一点的任何想法?
  • 使用const static int pValues[] = {...}?
【解决方案2】:

您可以使用测试文件并将其中的数据保存为压缩的二进制格式。然后将文本文件和 dll/lib 一起分发

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多