当前位置: 首页 > 面试题库 >

如何利用Java或Python中的文件系统缓存?

弓泰
2023-03-14
问题内容

Elasticsearch网站上的最新博客文章正在讨论其新的1.4 beta版本的功能。

我对它们如何利用文件系统缓存非常好奇:

最新版本增加了对文档值的支持。本质上,doc值提供的功能与内存中的字段数据相同,但是它们在索引时间写入磁盘。它们提供的好处是它们只占用很少的堆空间。从磁盘而不是从内存读取Doc值。尽管磁盘访问速度很慢,但是doc值受益于内核的文件系统缓存。与JVM堆不同,文件系统缓存不受32GB限制的约束。通过将字段数据从堆转移到文件系统缓存,可以使用较小的堆,这意味着可以更快地进行垃圾回收,从而获得更稳定的节点。

在此版本之前,doc值比内存中的现场数据要慢得多。 此版本中的更改显着提高了性能,使其几乎与内存中的字段数据一样快。

这是否意味着我们可以操纵文件系统缓存的行为,而不是被动地等待来自操作系统的影响?如果是这样,我们如何在正常的应用程序开发中利用文件系统缓存?说,如果我正在编写Python或Java程序,该怎么做?


问题答案:

文件系统缓存是与OS内部工作相关的实现细节,对最终用户是透明的。不需要调整或更改。Lucene在管理索引段时已经使用了文件系统缓存。每次将某些文档索引到Lucene中(通过Elasticsearch)时,这些文档就会被写入段中,这些段首先被写入文件系统缓存中,然后经过一段时间(当translog(一种跟踪被索引文档的方式)被写入例如完整)将缓存的内容写入实际文件。但是,尽管要建立索引的文档位于文件系统缓存中,但仍可以访问它们。

doc值实现的这一改进指的是此功能现在可以使用文件系统缓存,因为它们是从磁盘读取,放入缓存并从那里访问的,而不是占用堆空间。

这篇出色的博客文章描述了如何访问此文件系统缓存:

在以前的方法中,我们依靠使用syscall在文件系统缓存和本地Java堆之间复制数据。如何直接访问文件系统缓存?这就是mmap所做的!

基本上,mmap就像将Lucene索引作为交换文件处理一样。mmap()syscall告诉操作系统内核将我们的整个索引文件虚拟地映射到先前描述的虚拟地址空间,并使它们看起来像我们的Lucene进程可用的RAM。然后,我们可以访问磁盘上的索引文件,就像它是一个大的byte
[]数组一样(在Java中,该文件由ByteBuffer接口封装以使其可以被Java代码安全使用)。如果我们从Lucene代码访问此虚拟地址空间,则无需进行任何系统调用,处理器的MMU和TLB将为我们处理所有映射。如果数据仅在磁盘上,则MMU将导致中断,并且O
/ S内核会将数据加载到文件系统缓存中。如果已在缓存中,则MMU / TLB会将其直接映射到文件系统缓存中的物理内存。

与在Java程序中使用mmap的实际方法相关,我认为这是这样做的类和方法。



 类似资料:
  • 问题内容: 我正在用C ++写一个基准测试工具,我想在两次实验之间清除文件系统内存缓存。我知道以下控制台命令: 我的问题是如何直接在C ++中以编程方式执行此操作? 任何帮助表示赞赏! 问题答案: 只需写:

  • 我正在开发一个Web应用程序,其中后端在Spring引导中开发,消耗公共API中返回JSON中数据的数据。搜索是通过术语、全文(像谷歌)完成的,后端从应用程序前端接收用户的查询,用户的查询反过来搜索公共应用编程接口,等待响应,处理信息并将其发送到前端。我想在后端Spring Boot中实现缓存系统。基本上,在Spring引导调用API发布并等待响应之前,它会检查键/值系统是否已经在过去完成了搜索,

  • 我有一个循环,运行整个目录,我需要从每个文件获得路径,以便使用它。 这是我的方法

  • 目标是为每个行添加具有修改时间的列。 鉴于 预期的 我写了一个函数来获取修改时间 修改时间:长=1580708401253 ...但它在查询中不起作用 组织。阿帕奇。火花SparkException:作业因阶段失败而中止:阶段54.0中的任务0失败4次,最近的失败:阶段54.0中的任务0.3丢失(TID 408,srs-hdp-s1.dev.kontur.ru,executor 3):org。阿帕

  • 我使用expo下载了一张图片(a.jpg),代码如下: 文件成功保存在文件系统中。后来当我试图读取文件时,我得到一个错误,文件无法读取。用于读取文件的代码: 上面的代码返回文件无法读取的错误。fileInfo.exists是true,因为文件存在于文件系统中。 读取文件时出错: 如果我尝试读取一个文本文件(a.json),而不是jpg(a.jpg),那么一切都很好。所以,文件系统。readAsSt

  • 问题内容: 我正在创建在Linux服务器上运行的Web应用程序。该应用程序一直在访问一个250K的文件- 将其加载到内存中,读取并向用户发送一些信息。由于此文件一直被读取,因此我的客户建议使用诸如memcache之类的东西将其缓存到内存中,大概是因为它可以使读取操作更快。 但是,我认为Linux文件系统可能已经在缓存文件,因为它经常被访问。那正确吗?您认为memcache会带来真正的改善吗?还是要