32 位应用程序内存不足

32-Bit Application runs out of Memory

本文关键字:内存不足 应用程序      更新时间:2023-10-16

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

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

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

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

所有的想法或多或少都是适当的,实用的和快速的(实施速度和执行速度)。这 每个想法的优点和缺点都非常复杂,将超出此范围。

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


[更新]

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

当前数据库就像一个包含字符串、双精度或长数据值的内存表。 每行可以包含一组不同的列。但大多数表格都像 结构化数据库表。整个表数据在一个块中加密和压缩。 加载后,整个数据都会在内存中扩展,我们可以非常快速地访问这些数据。 如果需要索引,我们使用软件中的 std::map 来执行此操作。 我们尝试将当前的表数据与SQLite和EJDB进行比较。包含以下内容的文件 大约五十万篇简单文章数据在我们的数据中需要 3.5 MB,在 SQLite 中需要 28 MB 和 100 MB(在 几个文件)在 EJDB 上。SQLite 和 EJDB 以纯字符串或简单的二进制部分显示数据 例如"双倍"。因此,使用好的编辑器,您可以将文章编号与价格非常匹配 容易。

该软件使用大约 40 个 DLL,其中包含第三方库的多个依赖项。所以从 32 到 64 位是一个挑战。它也不能解决我们的 32Bit 终端服务器的问题吗 客户端安装。

使用真正的数据库(如MySQL,MongoDB等)也是一个巨大的挑战,因为我们经常更新我们的数据库。 每个月在广泛的计算机基础上的数据。没有所有互联网连接可以使用 真实服务器客户端模型。

那么我们能做什么呢?

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

重新编程我们的数据库,使其使用较小的数据块,这些数据块在此叶子上并加载 大块按需整理? 只有索引在内存中。管理磁盘数据可能使用 B 树策略。

时间不多了。因此,重新发明轮子无济于事。你会做什么或使用这样的 一种情况 ?

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

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