32 位应用程序内存不足
32-Bit Application runs out of Memory
我有内存问题。自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 地址空间。
- 可视化 使用 VS Code 查找C++应用程序中的内存泄漏
- 应用程序内存使用量减少
- 在C++应用程序中使用 Tensorflow:如何释放 GPU 内存
- 任务管理器 - C/C++ 应用程序 - 分配的地址空间与已用内存
- OpenGL GLFW 应用程序 - 客户端内存限制
- 使用没有堆内存分配的接口的框架应用程序?
- 我们如何访问 Node.js 应用程序之外的内存?
- 使用 IPC 共享内存的应用程序是否可以访问彼此的代码?
- 使用 valgrind 的地块测量 c++ 应用程序的最大内存使用量(堆栈和堆)
- 为什么Linux报告了我的应用程序的内存使用情况
- 是否可以锁定应用程序中常见控件使用的内存?
- 如何以编程方式获取应用程序的内存使用情况
- 32 位应用程序内存不足
- CRT 检测到应用程序在堆缓冲区(新建/删除)类结束后写入内存
- 在本机 Android 应用中处理内存不足
- Android OpenCV 应用程序的内存问题
- C++ 分配器在内存不足时使应用程序崩溃
- 如果我们不删除内存并且应用程序已退出,是否存在内存泄漏
- 在imedicontrol上直接显示MP4Demux应用程序内存不足
- 内存不足错误在c++ /MFC应用程序