- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
使用内核 AIO 和 O_DIRECT|O_SYNC
,不会复制到内核缓冲区,并且可以在数据实际刷新到磁盘时获得细粒度通知。但是,它需要将数据保存在 io_prep_pwrite()
的用户空间缓冲区中。
使用 splice()
,可以将数据从内核空间缓冲区(管道)直接移动到磁盘,而无需复制它。但是,splice()
在数据排队后立即返回,并不等待实际写入磁盘。
目标是将数据从套接字移动到磁盘而不复制它,同时确认它已被清除。如何结合之前的两种方法?
通过将 splice()
与 O_SYNC
结合使用,我预计 splice()
会阻塞,并且必须使用多个线程来屏蔽延迟。或者,可以使用异步 io_prep_fsync()
/io_prep_fdsync()
,但这会等待所有数据被刷新,而不是等待特定的写入。两者都不完美。
需要的是 splice()
与内核 AIO 的组合,允许零复制和异步写入确认,这样单个事件驱动的线程就可以将数据从套接字移动到磁盘,并且在需要时获得确认,但这似乎不受支持。是否有好的解决方法/替代方法?
最佳答案
要获得写入确认,您不能使用 splice()。
用户空间中有 aio 的东西,但如果你在内核中这样做,它可能会找出生成了哪些 bio( block I/O)并等待它们:
block I/O 结构:
如果你想使用AIO,你需要使用io_getevents():
以下是有关如何执行 AIO 的一些示例:
如果您从用户空间执行此操作并使用 msync 如果它实际上正在旋转生锈,它仍然有点悬而未决。
msync() 文档:
您可能不得不降低预期以使其更健壮,因为实际确保写入是按逻辑写入磁盘可能非常昂贵。
鉴于断电之类的情况,写保证的“最高”典型标准是修改存储的日志记录操作。日志本身只是附加的,您可以在回放时查看条目是否完整。最后的日记条目可能不完整,因此仍有可能丢失某些内容。
关于写入磁盘时的 Linux splice() + 内核 AIO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20239939/
我正在使用 JavaScript splice() 方法从数组中删除一个元素。代码如下, var fruits = ["Banana", "Orange", "Apple", "Mango"]; fu
JavaScript 拼接方法实际上将数组拆分为两个,如下例所示: var a = ['a','b','c']; var b = a.splice(0,2); console.log(a); // o
我正在尝试从包含表单输入字段的数组中删除某些值: allFields = theForm.getElementsByTagName("INPUT"); for(j = 0; j =0; j--){
var arr = document.querySelectorAll("a[href*='somestring']") 返回控制台中看起来像数组的内容。方括号 [] 和 arr.length = 7
我正在尝试从 javascript 中的数组中删除特定项目,但似乎无法使 [array].splice 函数正常工作。 此代码用于检查 SVG 对象是否与另一个对象发生碰撞(对于游戏)。玩家总是希望与
所以这是一个语法问题,我一直在阅读 MDN 文档,但我找不到类似的例子。我从这里得到了这个特定的代码片段:https://bost.ocks.org/mike/shuffle/正如我正在阅读随机数组一
这个问题在这里已经有了答案: What is the difference between call and apply? (23 个回答) 关闭 8 年前。 我正在尝试将可在函数内部访问的 arg
我有一个数组,它在任何时候都可能包含以下值的任意组合: var positions = ['first', 'second', 'third', 'fourth']; 目标是重建一个 Javascri
我运行它是为了获取 HTML 表单控制元素的集合 var elem = document.getElementById('display').elements; 我可以运行它来获取一组元素: var
如何正确使用Array.Splice? var myEmptyData = []; myEmptyData = $.parseJSON('[{ "m_sPartNumber": "B104-9
这个问题已经有答案了: Why does changing an Array in JavaScript affect copies of the array? (13 个回答) 已关闭 7 年前。
我正在为每个单击的导航容器设置一个 cookie。 它设置一个连接的数组并设置cookie值。如果再次单击,则将其从数组中删除。 它有点问题。 只有点击其他元素后才会拼接。然后它的行为就很奇怪。 可能
Javascript(使用 jQuery): var paragraphs = [ ['This is my first paragraph content of the first arra
如果我正在制作一款游戏,并且我希望某些内容仅每隔一段时间更新一次,那么解决此问题的最佳方法是什么? 我天真的想法只是保留一个通过 mod 循环的“帧”跟踪器。数学并以特定数字更新特定内容。 有更好的方
这个问题已经有答案了: How do you clone an array of objects in JavaScript? (33 个回答) using splice(0) to duplicat
我有数组 x、y 和 z。在遍历 x 时,根据条件我需要不断从 z 中删除元素。这是我正在尝试做的事情: var x = ["test0", "test1", "test2"]; var y = ["
我有 3 个包含时间段的数组,它们是字符串...像这样: $scope.shiftMorning = ['09:00', '09:30', '10:00', '10:30', '11:00', '11
我在我的表单上创建了一个功能,我可以通过单击一个按钮为多个图像添加多个文件输入,这按预期工作。现在,当我尝试使用 .splice 删除输入字段时,它会不断删除我的输入字段所在的数组的最后一项,而不是具
我必须向数组添加一些值。 代码示例: temp[0]=new Array("0","0"); temp[1]=new Array("0","0"); temp[2]=new Array("0","0"
我有一个包含字符串的数组,如果字符串中没有任何内容,我想使用 .splice() 将其从数组中删除。 不知何故,它没有得到所有空条目。如果开头有 2 个空条目,它只会得到一个。 这是我的 fiddle
我是一名优秀的程序员,十分优秀!