问题标签 [fragmentation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql - 为什么我的索引变得碎片化?
我有一个简单的小表(只有 8 个字段),一小时前我重建了表上的一个索引,将其重置为 0% 碎片,但现在高达 38%。
该表本身有 400k 条记录,但自从我重建索引以来只插入了 158 条新记录,记录没有更新,但可能有几次删除。
为什么索引会变得如此碎片化?
该索引是非唯一的,仅在一个字段上不聚集。
数据库在 SQL Server 2005 上运行,但兼容级别为 SQL Server 2000。
谢谢
c++ - 实体“碎片整理”约束求解器/算法
更新:
实体是使用给定实体模板的属性/方法创建的对象。一个实体可能有一个父级和/或多个子级。
每个实体模板都有线程碎片成本和计算机碎片成本。他们定义了在与父级不同的计算机/线程上拥有该实体的子级的成本
新实体将在每次迭代结束时分配给计算机和线程(通过添加),旧实体可能在每次 N 迭代结束时重新分配给计算机和线程(通过碎片整理)。
调用 add 时,会创建一个实体并将其附加到给定的父级。但是,它仍然必须放置在计算机线程的模拟运行器中。
决定分配的因素是子 {computer|thread} 碎片成本和可选的碎片成本矩阵。
原来的
你好,
我只是想获得一些关于一般方向/算法/领域的想法来解决以下问题。
我在迭代实时模拟环境中有 N 个实体(每个实体都有一个可能的父级和可能的 M 个子级) 。每个实体都放置在服务器环境中,它位于一台计算机和该计算机上的 1 个线程上。每个实体都有一个“计算机碎片成本”和“线程碎片成本”,这是一个 0->1 的值(其中 1 是最昂贵的),它定义了在不同计算机上拥有该实体的孩子的痛苦/成本或线程。“计算机碎片成本”将高于“线程碎片成本”。
我有2次手术。最初添加实体时执行的“添加”操作。我还有一个“碎片整理”操作,在每次 Y 次迭代结束时运行,将实体重新定位到不同的线程/计算机。
考虑到碎片成本,什么是确保碎片对于这两个操作保持在最低限度的一般算法/指南?
此外,每个实体都是从预定义的模板创建的。将有一个矩阵定义每对实体模板之间的碎片成本。这些额外的数据如何用于降低碎片化?
谢谢
c++ - 在运行时检测 C++ 中的堆碎片的便携式方法?
我正在编写一个基于 qt 的 c++ 应用程序,我需要能够检测内存碎片,以检查当前系统是否可以实际承受内存负载:程序加载大图像(15/21 兆像素是标准)在内存中,然后对其执行一些过滤(使用稀疏矩阵)。例如,我在 Windows 中遇到内存碎片问题,而 VMMap 在这方面非常有帮助:问题是一些 DLL(Wacom 平板电脑“wintab32.dll”和 UltraMon 应用程序)没有重新定位,所以拆分地址空间在进程的 0x10000000-0x30000000 VA 处。
我想为应用程序提供对碎片问题的某种认识,并想知道是否已经存在提供 VMMAP 提供的信息的跨平台 (linux/mac/win32) 方法。
c# - C#:按照分配的相反顺序处理资源有什么好处吗?
许多年前,我被告诫要尽可能以与分配方式相反的顺序释放资源。那是:
我想在 640K MS-DOS 机器上,这可以最大限度地减少堆碎片。在 C# /.NET 应用程序中执行此操作有什么实际优势,或者这是一种已经过时的习惯?
sql-server - Sql server 2005 需要每日索引碎片整理
我们的生产数据库需要对其一张表进行每日索引碎片整理。该表有几个索引,其中一个每天会产生 90% 的碎片。
该索引位于两个日期字段(开始时间和结束时间)上。
我们的开发数据库没有遇到这个问题,尽管这显然具有低得多的吞吐量。
每天晚上我们都会安排一项维护任务来进行碎片整理,但这有时需要在办公时间运行。
该表目前有 250,000 条记录,并且每天以大约 500 到 3000 条记录的速度增长。
关于为什么它如此迅速地变得支离破碎的任何想法?
sql - SQL Server 2005 索引碎片
我继承的 SQL Server 2005 数据库中的几个键具有非常高的碎片百分比。使用以下 SQL 时:
我看到几个表的碎片百分比在 50 到 99 之间。这些表都有超过 100,000 行,有些有 2,000,000+。我相信这会导致我们的应用程序出现严重的性能问题,因此我尝试使用以下 sql 重建其中一些索引:
但是,在我重建索引并再次查看碎片百分比后,它们都没有改变。有什么我想念的吗?我已经对这个主题进行了一些搜索,但到目前为止都是空的。
谢谢!
memory - 逻辑地址混乱
我正在尝试对逻辑地址进行一些分析。以下程序解释了我的动机......
当我在我的 32 位系统中运行这个程序时,它显示
我希望将逻辑地址与页面大小相关联。我的意思是说这个逻辑地址是如何创建的(就偏移量、页面、数据而言)
对于这个程序大小是 1257 字节,但我认为整个页面都会被加载(如果我错了,请纠正我)有什么方法可以确保整个页面被加载或只有 1257 字节被加载。
我希望我的问题很清楚,如果有任何差异,请告诉我。谢谢
c# - 我应该在使用大对象堆后立即调用 GC.Collect 以防止碎片吗
我的应用程序对大对象进行了大量的二进制序列化和压缩。未压缩的序列化数据集约为 14 MB。压缩后约为 1.5 MB。我发现每当我在我的数据集上调用 serialize 方法时,我的大型对象堆性能计数器就会从 1 MB 以下跃升至大约 90 MB。我也知道,在一个负载相对较重的系统下,通常在运行一段时间(几天)后,这个序列化过程发生了几次,当调用这个序列化方法时,应用程序会抛出内存异常,即使有似乎是足够的内存。我猜碎片化是问题所在(虽然我不能说我 100% 确定,但我已经很接近了)
我能想到的最简单的短期修复(我想我正在寻找短期和长期答案)是在我完成序列化过程后立即调用 GC.Collect。在我看来,这将从 LOH 中垃圾收集对象,并且可能会在其他对象添加到它之前这样做。这将允许其他对象紧紧地贴在堆中的剩余对象上,而不会造成太多碎片。
除了这个荒谬的 90MB 分配之外,我认为我没有其他任何使用 LOH 丢失的东西。这种 90 MB 的分配也比较少见(大约每 4 小时一次)。当然,我们仍然会有 1.5 MB 的数组,可能还有一些其他更小的序列化对象。
有任何想法吗?
由于良好的反应而更新
这是我完成工作的代码。实际上,我已经尝试将其更改为压缩 WHILE 序列化,以便序列化同时序列化为流,但我没有得到更好的结果。我还尝试将内存流预分配到 100 MB,并尝试连续两次使用相同的流,无论如何 LOH 都会上升到 180 MB。我正在使用 Process Explorer 来监控它。这太疯狂了。我想接下来我会尝试 UnmanagedMemoryStream 的想法。
如果你不愿意,我会鼓励你们尝试一下。它不必是这个确切的代码。只需序列化一个大数据集,你就会得到令人惊讶的结果(我的有很多表,大约 15 和很多字符串和列)
尝试使用 UnmanagedMemoryStream 进行二进制序列化后更新
即使我序列化为 UnmanagedMemoryStream,LOH 也会跳到相同的大小。看来无论我做什么,调用 BinaryFormatter 来序列化这个大对象都会使用 LOH。至于预分配,它似乎没有多大帮助。说我预分配说我预分配 100MB,然后我序列化,它将使用 170MB。这是代码。比上面的代码还要简单
中间的 GC.Collect() 只是用来更新 LOH 性能计数器。您将看到它将分配正确的 100 MB。但是当您调用序列化时,您会注意到它似乎将它添加到您已经分配的 100 个之上。
memory - 如何记录程序上的每个内存分配和释放?
我想看看碎片化是增加我的扭曲服务器的内存使用量的原因。我在这里发布了一个问题: 如何找到扭曲服务器内存使用量增加的来源?
现在,我要做的是可视化堆。找到一篇文章:内存碎片。那篇文章中的堆图就像我想要的一样。用matplotlib或者其他工具画出这样的图对我来说并不难。最困难的工作是:如何记录内存分配和释放?
我知道我可以修改 CPython 的源代码,在 omalloc.c 中添加一些日志记录代码并重新编译 Python,然后使用修改后的 CPython 来运行我的服务器。但是,我不想为此浪费时间。然后我正在寻找一些可用的工具。我知道有一个工具valgrind可以用来检测内存泄漏,但我不知道如何记录分配和释放。我看到它的 memcheck 可以检测到类似的东西:
- 无效读取
- 未初始化
- 免费无效
但这不是我想要的,我需要的是:
- 用时间、地址和大小记录内存的每次分配和释放
我的问题是:
- 我怎么能用 valgrind 做到这一点?
- 如果我不能,我应该为此编写一个模块吗?
- 或者有没有更好的工具可以做到这一点?
谢谢。
windows - 创建分段 IPv4 数据包的简单方法
我目前正在研究网络堆栈,并且正在尝试实现 IPv4 分段。虽然我有一个理论上可行的实现,但我想通过向它抛出实际的碎片数据包来实际测试它是否有效。
是否有任何软件或一种简单的方法来编写代码来做到这一点?我宁愿不去修改我正在测试的主机上的 MTU,只是为了让它工作。我的开发环境是Windows。