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

时间:2014-02-23 19:17:57

标签: c++ shared-libraries conventions

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

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

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

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

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

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

有没有人知道这种情况的做法?

2 个答案:

答案 0 :(得分:2)

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

将数据存储在文件中很好,只要数据的更改频率不超过您希望发布的新库 - 无论如何,您需要以某种方式存储数量,因此只要编译器将数据存储在共享库中并没有做出糟糕的工作,就我所看到的而言,它并不比任何其他选项更糟糕。

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

如果您确实有辅助文件,那么通过某种方式重新定义该位置绝对是有益的。

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

最后,它真的归结为:

  1. 您如何使用数据 - 您是否总是需要所有数据,或者您是否只需要一些数据?如果是后者,你怎么知道哪些位?
  2. 数据更改的频率。
  3. 如果数据可以压缩或不压缩,如果是这样,你用什么方法压缩它?
  4. 我不确定共享库是否有任何直接的大小限制 - 如果你需要1GB的数据,那么你在内存中需要1GB的空间,所以它不像你在节省内存[假设你总是需要所有数据和/或无法确定您需要哪些部分]。

答案 1 :(得分:1)

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