32位应用程序耗尽内存

时间:2017-04-05 08:10:15

标签: c++ out-of-memory 32bit-64bit

我有记忆问题。自12年以来,我们在我们的软件(C ++,32Bit)中使用自己创建的表来存储数据。 表存储在磁盘上。当我们想要使用它的数据时,它们会被加载到内存中并保留在那里。 有些表非常大,它们有超过200万行。当我们将它们加载到内存中时 它们高达400MB。由于32位和内存碎片,我们实际上可以加载最多2个这样的表int o在其他操作确实没有足够的内存之前的记忆。

该软件安装在3000多个客户端上。客户端的操作系统是win7-win10(32位和64位)以及一些微不足道的XP和Vista系统

所以我们讨论了一个很好的(快速,适当的)方法来摆脱这个问题。以下是一些想法:

  • 切换到64位
  • 从我们自己的表切换到sqlite或ejdb
  • 打开自己进程中的每个表,并与进程通信以获取表的数据
  • 扩展我们自己的表,可以直接从磁盘读取

所有想法都或多或少地具有适当性,实用性和快速性(实现速度和执行速度)。该 每个想法的优点和缺点都非常复杂,超出了这个范围。

有人有另一个好主意来解决这个问题吗?

[更新]

我将尝试从不同的角度解释这一点。首先是软件 安装在不同的Windows操作系统的基础上。从XP到W10全部 一种电脑。该软件可以在终端上的单个桌面上使用 具有中央LAN数据池的服务器(仅文件服务器上的文件夹)。 它以特殊方式收集文章。所以有很多关于的信息 所有类型的文章数据以及来自不同供应商的价格信息。 因此,非常需要将此信息隐藏/隐藏给外人。

当前数据库类似于字符串,双精度或长数据值的内存表。 每行可以包含一组不同的列。但大多数表都是这样的 结构化数据库表。整个表数据被加密并压缩成一个块。 加载后,整个数据在内存中扩展,我们可以非常快速地访问这些数据。 如果需要索引,我们在软件内部使用std :: map。 我们尝试将当前表数据与SQLite和EJDB进行比较。包含的文件 大约有50万个简单的文章数据在我们的数据中需要3.5 MB,在SQLite中需要28 MB,在100 MB(在 EJDB上的几个文件)。 SQLite和EJDB以简单的二进制文件显示简单字符串中的数据 例如" double"。因此,使用优秀的编辑器,您可以将商品编号与价格非常匹配 容易。

该软件使用大约40个DLL和几个第三方库的依赖项。所以改用 32到64比特是一个挑战。它也没有解决我们的32Bit终端服务器的问题 客户端安装。

进入真正的数据库(如MySQL,MongoDB等)也是一个很大的挑战,因为我们经常更新我们的 每个月在广泛的计算机上的数据。互联网连接并不总是使用 真正的服务器客户端模式。

那我们该怎么办?

使用SQLite或EJDB或其他东西并在每个字段中加密我们的数据?

重新编程我们的数据库,因此它使用较小的数据块,并将其载入并加载 他们被带走了需求的大块? 只有索引在内存中。可以使用B-Tree策略来管理磁盘数据。

时间很短。所以重新发明轮子并没有帮助。你会做什么或使用什么? 一种情况?

1 个答案:

答案 0 :(得分:2)

  

400MB。由于32位和内存碎片,我们实际上可以加载最多2个这样的表

你是不是通过分配大量内存并从光盘中读取表内容来“加载”这个表?如果是这样,那么你应该切换到使用较小的内存映射块加载表(可能每个4Mb对应于大内存页面大小)。这样,您应该能够利用大部分可用于32位程序的3.5 Gb地址空间。