- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下练习来自p。 Ierusalimschy 的 Programming in Lua(第 4 版)的 234。 (注意:在本书的前面,作者明确拒绝使用memoization这个词,并坚持使用memorization代替。记住这一点,因为你阅读下面的摘录。)
Exercise 23.3: Imagine you have to implement a memorizing table for a function from strings to strings. Making the table weak will not do the removal of entries, because weak tables do not consider strings as collectable objects. How can you implement memorization in that case?
我很难过!
我的部分问题是我无法设计出一种方法来实现字符串的(垃圾)收集。
相比之下,对于表,我可以为其配备终结器,它会在表即将被收集时报告。有没有办法确认给定的字符串(并且只有那个字符串)已被垃圾回收?
另一个困难是简单地弄清楚所需函数的规范是什么。我能做的最好的事情就是弄清楚它不是什么。在本书的前面(第 225 页),作者给出了以下“内存”功能的示例:
Imagine a generic server that takes requests in the form of strings with Lua code. Each time it gets a request, it runs
load
on the string, and then calls the resulting function. However,load
is an expensive function, and some commands to the server may be quite frequent. Instead of callingload
repeatedly each time it receives a common command like"closeconnection()"
, the server can memorize the results fromload
using an auxiliary table. Before callingload
, the server checks in the table whether the given string already has a translation. If it cannot find a match then (and only then) the server callsload
and stores the result into the table. We can pack this behavior in a new function:[standard memo(r)ized implementation omitted; see variant using a weak-value table below]
The savings with this scheme can be huge. However, it may also cause unsuspected waste. ALthough some commands epeat over and over, many other commands happen only once. Gradually, the ["memorizing"] table
results
accumulates all commands the server has ever received plus their respective codes; after enough time, this behavior will exhaust the server's memory.A weak table provides a simple solution to this problem. If the
results
table has weak values, each garbage-collection cycle will remove all translations not in use at that moment (which means virtually all of them)1:
local results = {}
setmetatable(results, {__mode = "v"}) -- make values weak
function mem_loadstring (s)
local res = results[s]
if res == nil then -- results not available?
res = assert(load(s)) -- compute new results
result[s] = res -- save for later reuse
end
return res
end
正如原始问题陈述所指出的,当要内存(r)化的函数返回字符串时,此方案将不起作用,因为垃圾收集器不会将字符串视为“可收集的”。
当然,如果允许更改所需函数的接口(interface),而不是返回一个字符串,而是返回一个单例表,其唯一项是真实结果字符串,那么问题几乎就变成了微不足道,但我很难相信作者脑子里有这么粗略的“解决方案”2。
以防万一,我使用的是 Lua 5.3。
1 顺便说一句,如果 memo(r)ization 的基本原理是避免不必要地更频繁地调用 load
,则作者提出的方案对我来说没有意义。在我看来,这个方案是基于这样一个假设(实际上是一种启发式),即经常使用并因此会支付 memo(r)ize 费用的翻译也是始终可以访问(因此不可收集)的翻译.我不明白为什么情况必然如此,甚至可能如此。
2 可以用 __tostring
方法的形式给这只 pig 涂上口红,这样表格(备忘录返回的表格) (r)ized function) 在某些上下文中伪装成字符串;不过,它仍然是一头 pig 。
最佳答案
你的想法是正确的:将字符串包装成一个表(因为表是可收集的)。
function memormoize (func_from_string_to_string)
local cached = {}
setmetatable(cached, {__mode = "v"})
return
function(s)
local c = cached[s] or {func_from_string_to_string(s)}
cached[s] = c
return c[1]
end
end
而且我在这个解决方案中没有看到 pig :-)
one that is always reachable (and hence not collectable). I don't see why this should necessarily, or even likely, be the case.
在弱表中不会有“总是可达”的项目。
但是最频繁的项目只会在每个 GC 周期重新计算一次。
理想的解决方案(从不收集经常使用的元素)将需要更复杂的实现。
例如,当项目的“不活动计时器”达到某个阈值时,您可以将项目从普通缓存移至弱缓存。
关于lua - 垃圾收集和字符串到字符串函数的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56980482/
引用网址 http://hi.baidu.com/quiteuniverse/blog/item/9f3f043d46ad1e07bba16716.html 以下函数调用方式:&nbs
我什至不确定如何描述我正在尝试做的事情,因为我对 cookie 了解不多,但就这样吧。 是否可以使用PHP从浏览器缓存中收集一个cookie(或cookie文件),将其保存到数据库中,然后清除缓存并重
我正在使用 Room(v. 2.2.1)和协程支持(v. 1.3.2)并进行以下设置 @Entity(tableName = "simple_table") data class SimpleEnti
我正在尝试编写一个基于时间运算符收集/累积值的规则。 rule "Zone6 Overlap" when $i1 : Instance ($e1 : event == " Vel : 20.9
我有一个简单的 BST,定义了节点结构: struct node { int key_value; struct node *left; struct node *right; }; ty
我有这个对象: public class MenuPriceByDay implements Serializable { private BigDecimal avgPrice; p
我正在开发一个应用程序,需要访问给定传感器的“最后 5 秒有值(value)的数据”。我的计划是以某种方式存储这些数据,然后当我请求数据时,它将返回最近 5 秒内获得的所有数据。鉴于以下情况,我不确定
在 Ruby 中,您可以对数组使用 map/collect 方法来修改它: a = [ "a", "b", "c", "d" ] a.collect! {|x| x + "!" } a
我即将开始实时收集大量数字数据(对于那些感兴趣的人,各种股票和 future 的出价/要价/最后或“磁带”)。稍后将检索数据以进行分析和模拟。这一点都不难,但我想高效地做到这一点,这会带来很多问题。我
我提出这个问题是为了寻求有关如何设计系统的实用建议。 像 amazon.com 和 pandora 这样的网站拥有并维护着庞大的数据集来运行他们的核心业务。例如,亚马逊(以及所有其他主要电子商务网站)
假设我们有一个数据数组和另一个带索引的数组。 data = [1, 2, 3, 4, 5, 7] index = [5, 1, 4, 0, 2, 3] 我们想从 index 的 data 元素创建一个
好的,我已经阅读了几个关于它的主题,但现在就开始吧。假设我有一个应用程序,基本上我会时不时地点击一个按钮,几分钟内会发生很多事情,然后它可能会再闲置一个小时,或者可能只是 1 分钟。难道不是在整个结束
我有一个数据框,例如 Seq Chrm start end length score 0 A C1 1 50 49 12 1 B
我正在考虑在 Object[] 数组中收集泛型方法的所有方法参数以进行记录。我知道使用方面可以更好地实现这一点,但是我不允许使用它,并且如果可能的话我正在寻找一种基于纯反射的方法 为了澄清, 假设一个
快速提问: 如果 Socket 对象(及其本地缓存的 InputStream 和 OutputStream 对象)超出范围并被垃圾收集,连接是否在 JVM 中保持打开状态? (即,不会在监听服务器上抛
是否有用于收集 facebook 公共(public)数据作为实时提要的 API。我阅读了关于用于收集数据的公共(public)提要 API,但我现在不能申请,而且它不是免费的,还有 Open str
摘要 :我使用自定义收集器收集给定搜索的所有命中的文档 ID(它使用 ID 填充 BitSet)。根据我的需要,搜索和获取文档 ID 的速度非常快,但是当涉及到从磁盘实际获取文档时,事情变得非常缓慢。
我正在寻找一种方法来从自定义 Gradle 插件收集给定项目的所有依赖约束(通过常规 platform 和/或 enforcedPlatform 和/或“手动”强制执行)。 在 Maven 世界中,您
我有一个 CSV 格式的用户列表,但我需要按广告中的名称从每个用户收集 SamAccount 属性。 CSV 模型 脚本 Get-ADObject -Filter 'ObjectClass -eq "
我得到了一个非常大的列表,其中包含大约 200 个带有文本和图像的项目。 ng-repeat 是一种缓慢渲染的方式。它尝试过这个 solution 。效果很好。但不适合重复收集。 我的网络服务返回此:
我是一名优秀的程序员,十分优秀!