阅读本文需要5分钟左右 简介 之前的文章中,我们使用JOL工具简单的分析过String,数组和集合类的内存占用情况,这里再做一次更详细的分析和介绍,希望大家后面再遇到OOM问题的时候不再抱头痛哭,而是可以有章可循...String String是一个非常特殊的对象,它的底层是以byte数组存储的。 注意,在JDK9之前,String的底层存储结构是char[],一个char需要占用两个字节的存储单位。...当然这只是这个String对象的大小,不包含底层数组的大小。 ? 我们来计算一下String对象的真实大小: String对象的大小+byte数组的大小=24+32=56字节。...treeMap 来个比较复杂的TreeMap: ? 总结 本文用图形的形式形象的展示了集合对象,数组和String在内存中的使用情况。...后面的几个集合我就没有一一计算,有兴趣的朋友可以在下方回复你计算的结果哟。 ·END·
GRPO 对内存需求较高的原因在于,其内部涉及多个模型,并且在训练数据中每个查询会产生多个输出。上图中的策略模型、参考模型和奖励模型各自都是一个需要进行推理的 LLM。...(尽管从技术上讲,奖励模型可能不需要参数化,可以只是一个 Python 函数或正则表达式,但不影响 GRPO 对内存的高需求。) 为什么 8-Bit 优化和梯度检查点有助于减少内存占用?...虽然这会使训练速度减慢约 20-30%,但它显著减少了内存使用。 结合这些技术,即使对 GPU 资源有限的人来说,也能够训练更大的模型。...gradient_accumulation_steps=4,优化器是另一个占用大量 VRAM 的地方。此参数决定了我们将存储的梯度以帮助优化器进行其「爬山」过程。...参考模型参数:每个参数占用 2 字节。 梯度:每个参数占用 2 字节。 优化器状态:每个参数占用 8 字节。 8 位优化器:每个参数占用 4 字节。 PEFT:有助于减少梯度的显存占用。
简介 之前的文章中,我们使用JOL工具简单的分析过String,数组和集合类的内存占用情况,这里再做一次更详细的分析和介绍,希望大家后面再遇到OOM问题的时候不再抱头痛哭,而是可以有章可循,开始吧。...注意最后面的Object数组,如果数组中存储的不是基础类型,那么实际上存储的是执行该对象的指针,该指针大小是4个字节。...String String是一个非常特殊的对象,它的底层是以byte数组存储的。 注意,在JDK9之前,String的底层存储结构是char[],一个char需要占用两个字节的存储单位。...再加上hash,coder,和hasIsZero属性,最后的大小是24字节。 我这里使用的是JDK14的String版本,不同的版本可能有所不同。...当然这只是这个String对象的大小,不包含底层数组的大小。 ? 我们来计算一下String对象的真实大小: String对象的大小+byte数组的大小=24+32=56字节。
字符串池化,减少重复实例,内存降低,一切就是这样的轻松愉快。 开篇摘要 本文通过一个简单的业务场景,来描述如何通过字符串池化来减少内存中的重复字符串实例,从而减少内存的占用。...这样一个字典,大约需要 61MB 的内存。 而这是理论上,这个字典占用了内存最小情况。因为,其中每个 Color 使用的都是上面的八十个范围之一。因此,他们达到了没有任何重复实例的目的。...这个数据将会作为后续代码的一个基准。 尝试从数据库载入到内存 实际业务肯定是从数据库之类的持久化存储载入到内存中的。因此,我们度量一下,没有经过优化情况下,这种载入方式大概需要多大的内存开销。...(一千五工资加薪到三千,涨薪 100%的即时感) 当然,你可能会怀疑,多出来的这些开销实际上是数据库操作消耗的。...剔除重复的字符串实例 既然我们怀疑多出来的开销是重复的字符串,那么我们就可以考虑通过将它们转为同一个对象的方式,减少字典中重复的字符串。
字符串池化,减少重复实例,内存降低,一切就是这样的轻松愉快。 Newbe.Claptrap 是一个用于轻松应对并发问题的分布式开发框架。...开篇摘要 本文通过一个简单的业务场景,来描述如何通过字符串池化来减少内存中的重复字符串实例,从而减少内存的占用。...而这是理论上,这个字典占用了内存最小情况。因为,其中每个 Color 使用的都是上面的八十个范围之一。因此,他们达到了没有任何重复实例的目的。 这个数据将会作为后续代码的一个基准。...(一千五工资加薪到三千,涨薪 100%的即时感) 当然,你可能会怀疑,多出来的这些开销实际上是数据库操作消耗的。...剔除重复的字符串实例 既然我们怀疑多出来的开销是重复的字符串,那么我们就可以考虑通过将它们转为同一个对象的方式,减少字典中重复的字符串。
由于redis是一个纯内存的数据库,在存放大量数据时,内存的占用将会非常可观。那么在一些场景下,通过选用合适的数据结构来存储,可以大幅减少内存的占用,甚至于可以减少80%-99%的内存占用。...同样的一批数据,我们换一种存储方式,先来看结果: ? 在我们利用zipList后,内存占用为123M,大约减少了85%的空间占用,这是怎么做到的呢?我们来从redis的底层存储来剖析一下。...总结 大量的key-value,占用过多的key,redis里为了处理hash碰撞,需要占用更多的空间来存储这些key-value数据。...而通过hash算法后,将32降到了8个字节的长整形,这显著降低了key的空间占用。 zipList比hashTable明显减少了内存占用,它的存储非常紧凑,对查询效率影响也很小。...后续,我们会基于更极端一些的场景,如统计独立访客等,来看一下redis的不常见的数据结构,是如何将内存占用由20G降低到5M。
如果设置了maxmemory选项(值 >= 1),redis在接收命令时总是会判断当前是否已经超出最大内存限制,如果超过限制会根据驱逐策略去释放内存(如果是同步释放且释放内存很大,则会阻塞其他命令的执行...优点: 立即删除能保证内存中数据的最大新鲜度,因为它保证过期键值会在过期后马上被删除,其所占用的内存也会随之释放。对内存来说是非常友好的。 缺点: 立即删除对cpu是最不友好的。...惰性删除 当数据到达过期时间时,先不做处理。等到下次访问该数据时,如果数据已过期,再对数据进行删除。 优点 :对于cpu来说是非常友好的,减少了cpu资源的占有。...通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用(处理"定时删除"的缺点) 定期删除过期key(处理"惰性删除"的缺点) 过期key的集合 redis 会将每个设置了过期时间的 key...如果删除操作执行次数过多、执行时间太长,就会导致和定时删除同样的问题:占用大量cpu资源去进行删除操作 如果删除操作次数太少、执行时间短,就会导致和惰性删除同样的问题:内存资源被持续占用,得不到释放。
第一个损失是会丢掉现在的饭碗。在生成式AI来临的时代,程序员需要阅读大量AI所生成的代码。但未来很长的一段时间内,当代码出现错误时,责任还是会落在使用生成式AI的人类程序员身上。...第一个线程看到的座位状态已经过时,可能会尝试预订一个实际上已被占用的座位。这有可能引发bug。失误2:忘记加synchronized关键字在有锁的这两个类里,有6个方法分别在6处加了锁。...Clojure如何从根源上避免Java并发编程两大坑Clojure默认数据是不可变的,这从根源上减少了大量并发bug。...这个函数应用到集合的每个元素上,同时提供元素的索引。这种方法倾向于声明式编程,描述“做什么”而非“怎么做”。不可变性简化了并发编程,同时Clojure也提供了工具来安全地管理必要的状态变化。...比如Clojure版的影院订票系统中的 get-available-seats 函数,使用了 map-indexed 和 remove,这两个都是返回惰性序列的函数。
在Unity中,使用AssetBundle来加载资源可以提高资源加载效率和减少内存占用。...下面是使用AssetBundle加载资源的过程,以及如何在项目中合理使用AssetBundle来提高效率和减少内存占用的方法:使用AssetBundle加载资源的过程:创建AssetBundle:首先需要将需要加载的资源打包成...合理使用AssetBundle提高资源加载效率和减少内存占用的方法:按需加载:将资源打包成多个AssetBundle,按照功能模块、场景等进行划分。...例如,对纹理进行压缩、合并和裁剪等操作,减少内存占用。...以上是使用AssetBundle加载资源的过程和合理使用AssetBundle的方法,通过使用AssetBundle来加载资源,可以提高资源加载效率,减少内存占用,提升游戏性能。
此种删除策略可以保证过期key会尽可能快的被删除,并释放过期key所占用的内存。 但是此种策略对CPU时间是最不友好的。...例如,正有大量的命令请求在等待服务器处理,并且服务器当前不缺少内存的情况下,服务器应当优先将CPU时间用在处理客户端的命令请求上面,而不是用在删除过期key上面。...但是限制删除操作执行的时长和频率需要合理地设置,否则可能会演变成定时删除或者惰性删除。 通过定期删除策略,可以有效地减少因为过期key而带来的内存浪费。...此策略的缺点是对内存是最不友好的。如果一个key已经过期,而这个key又仍然保留在db中,那么只要这个过期key不被删除,它所占用的内存就不会释放。...例如,如果db中有非常多的过期key,而这些过期key又恰好没有被访问到的话,那它们也许永远也不会被删除,除非用户手动执行flushdb命令清空,这样会导致大量的无用的脏数据占用大量的内存。
立即删除 立即删除能保证内存中数据的最大新鲜度,因为它保证过期键值会在过期后马上被删除,其所占用的内存也会随之释放。但是立即删除对cpu是最不友好的。...而且目前redis事件处理器对时间事件的处理方式–无序链表,查找一个key的时间复杂度为O(n),所以并不适合用来处理大量的时间事件。...惰性删除 惰性删除是指,某个键值过期后,此键值不会马上被删除,而是等到下次被使用的时候,才会被检查到过期,此时才能得到删除。所以惰性删除的缺点很明显:浪费内存。...这对于性能非常依赖于内存大小的redis来说,是比较致命的。 定时删除 从上面分析来看,立即删除会短时间内占用大量cpu,惰性删除会在一段时间内浪费内存,所以定时删除是一个折中的办法。...定时删除是:每隔一段时间执行一次删除操作,并通过限制删除操作执行的时长和频率,来减少删除操作对cpu的影响。另一方面定时删除也有效的减少了因惰性删除带来的内存浪费。
惰性删除策略的缺点是,它对内存是最不友好的:如果一个键已经过期,而这个键又仍然保留在数据库中,那么只要这个过期键不被删除,它所占用的内存就不会释放。...在使用惰性删除策略时,如果数据库中有非常多的过期键,而这些过期键又恰好没有被访问到的话,那么它们也许永远也不会被删除(除非用户手动执行FLUSHDB),我们甚至可以将这种情况看作是一种内存泄漏——无用的垃圾数据占用了大量的内存...定期删除 从上面对定时删除和惰性删除的讨论来看,这两种删除方式在单一使用时都有明显的缺陷: □定时删除占用太多CPU时间,影响服务器的响应时间和吞吐量。 □惰性删除浪费太多内存,有内存泄漏的危险。...导致这种卡顿的另外一种原因是内存管理器需要频繁回收内存页,这也会产生一定的CPU消耗。...前面几期活动的很多数据都可以丢弃了,所以需要给相关的活动数据设置一个过期时间,以减少不必要的Redis内存占用。
指令结果状态XX具有时效性的数据-1永久有效的数据-2已经过期的数据 或 被删除的数据 或 未定义的数据 在redis中有3种过期数据删除策略:惰性删除和定期删除及定时删除数据删除策略目标:在内存占用与...优点:立即删除能保证内存中数据的最大新鲜度,因为它保证过期键值会在过期后马上被删除,其所占用的内存也会随之释放。对内存来说是非常友好的。缺点: 立即删除对cpu是最不友好的。...,但两次间隔不低于2ms,每次耗时不超过1ms定期删除注意事项:如果删除操作执行次数过多、执行时间太长,就会导致占用大量cpu资源去进行删除操作如果删除操作次数太少、执行时间短,就会导致内存资源被持续占用...优点:可以通过限制删除操作执行的时长和频率来减少删除操作对 CPU 的影响。另外定期删除,也能有效释放过期键占用的内存。缺点:难以确定删除操作执行的时长和频率。...总结删除策略特点对CPU资源总结定时删除节约内存,无占用不分时段占用CPU资源,频度高拿时间换空间惰性删除内存占用严重延时执行,CPU利用率高拿空间换时间定期删除内存定期随机清理每秒花费固定的CPU资源维护内存随机抽查
一、引言 在Python编程中,迭代是处理数据集合的常见操作。迭代器和生成器是Python提供的强大工具,能够帮助开发者以更高效、更内存友好的方式遍历和生成大量数据。...迭代器提供了一种顺序访问集合元素的方法,而生成器通过延迟计算的方式动态生成值,减少内存占用。...生成器的优势在于它是惰性求值的,即只在需要时生成数据,从而有效节省内存。 2....状态管理:生成器会自动保存函数的执行状态,而迭代器必须手动维护状态(如索引位置)。 内存效率:生成器通过延迟计算生成值,节省内存,而迭代器可以一次性加载大量数据。...五、生成器的应用场景 生成器在需要处理大量数据且无法一次性加载到内存的场景中非常有用,例如: 读取大文件:生成器可以逐行读取文件,避免将整个文件加载到内存中。
Redis作为一个高性能的内存NoSQL数据库,其容量受到最大内存限制的限制。 在实际生产环境中使用Redis时,偶然会觉得Redis的内存占用要比自己预想的大。...立即删除能保证内存中数据的最大新鲜度,因为它保证过期键值会在过期后马上被删除,其所占用的内存也会随之释放。但是立即删除对cpu是最不友好的。...2.惰性删除 惰性删除是指,某个键值过期后,此键值不会马上被删除,而是等到下次被使用的时候,才会被检查到过期,此时才能得到删除。所以惰性删除的缺点很明显:浪费内存。...3.定时删除 从上面分析来看,立即删除会短时间内占用大量cpu,惰性删除会在一段时间内浪费内存,所以定时删除是一个折中的办法。...定时删除是指:每隔一段时间执行一次删除操作,并通过限制删除操作执行的时长和频率,来减少删除操作对cpu的影响。另一方面定时删除也有效的减少了因惰性删除带来的内存浪费。
,以减少内存的无效暂用,达到释放内存的目的 过期策略分类 Redis内存过期策略分为三类,定时策略、惰性策略和定期策略 定时策略 含义:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在...key的过期时间来临时,对key进行删除 优点:保证内存被尽快释放,减少无效的缓存暂用内存 缺点:若过期key很多,删除这些key会占用很多的CPU时间,在CPU时间紧张的情况下,CPU不能把所有的时间用来做要紧的事儿...缺点:若大量的key在超出超时时间后,很久一段时间内,都没有被获取过,此时的无效缓存是永久暂用在内存中的,那么可能发生内存泄露(无用的垃圾占用了大量的内存) 定期策略 含义:每隔一段时间对设置了缓存时间的...优点:通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用–处理"定时删除"的缺点 定期删除过期key–处理"惰性删除"的缺点。...,根据策略清除部分 key 继续执行下一条命令, 以此类推 在这个过程中, 内存使用量会不断地达到 limit 值, 然后超过, 然后删除部分 key, 使用量又下降到 limit 值之下 如果某个命令导致大量内存占用
1、节省内存:生成器按需生成值,避免了一次性加载所有数据到内存中。这对于处理大型数据集尤其重要。 2、惰性计算:生成器支持惰性计算,只有在需要时才计算值。...使用场景 生成器在以下情况下特别有用: 1、大数据集处理(数据流处理):当处理大型数据集时,使用生成器可以避免内存溢出问题。比如可以处理大量数据,如日志文件、网络数据流等,避免一次性加载到内存中。...生成器的另一个常见用途是为表示值集合(例如列表或字典)的对象实现自定义迭代器。这也就需要说到再Python中另一种生成器使用形式:列表生成器。...但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。...总结 Python生成器是处理迭代任务的强大工具,通过按需生成值,提高了效率,减少了内存消耗。在大数据集处理、无限序列表示和惰性计算方面,生成器都显示出了其优越性。
,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除 优点:保证内存被尽快释放 缺点: 若过期key很多,删除这些key会占用很多的CPU时间,在CPU时间紧张的情况下,CPU...不能把所有的时间用来做要紧的事儿,还需要去花时间删除这些key 定时器的创建耗时,若为每一个设置过期时间的key创建一个定时器(将会有大量的定时器产生),性能影响严重 没人用 惰性删除 含义:key过期的时候不删除...了) 缺点:若大量的key在超出超时时间后,很久一段时间内,都没有被获取过,那么可能发生内存泄露(无用的垃圾占用了大量的内存) 定期删除 含义:每隔一段时间执行一次删除过期key操作 优点: 通过限制删除操作的时长和频率...,来减少删除操作对CPU时间的占用--处理"定时删除"的缺点 定期删除过期key--处理"惰性删除"的缺点 缺点 在内存友好方面,不如"定时删除" 在CPU时间友好方面,不如"惰性删除" 难点 合理设置删除操作的执行时长...4、RDB对过期key的处理 过期key对RDB没有任何影响 从内存数据库持久化数据到RDB文件 持久化key之前,会检查是否过期,过期的key不进入RDB文件 从RDB文件恢复数据到内存数据库 数据载入数据库之前
定时器的创建耗时,若为每一个设置过期时间的key创建一个定时器(将会有大量的定时器产生),性能影响严重 总结 用处理器性能换取存储空间 (拿时间换空间) 惰性删除 key过期的时候不删除...缺点 若大量的key在超出超时时间后,很久一段时间内,都没有被获取过,那么可能发生内存泄露(无用的垃圾占用了大量的内存) 总结 用存储空间换取处理器性能(拿空间换时间) 定期删除 ...(默认每个库检测20个key) 优点 通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用–处理"定时删除"的缺点 2)定期删除过期key–处理"惰性删除"的缺点。...内存淘汰机制 简述 Redis有过期策略,假如你的Redis只能存1G的数据,你一个请求写入2G,而你也没有及时请求key,那么惰性删除就不生效了,Redis占用内存就会越来越高。...,我们很少使用RDB的方式来恢复内存状态,因为会丢失大量的数据。
领取专属 10元无门槛券
手把手带您无忧上云