- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图通过一些调查来了解 Neo4j 对象缓存。我对对象缓存的第一印象来自这个链接中的幻灯片: http://www.slideshare.net/thobe/an-overview-of-neo4j-internals
具体来说,缓存中的节点/关系对象应该类似于幻灯片 9 或 15/42。为了验证这一点,我使用现有的图形数据库内容编写了一个简单的服务器脚本。我这样做的方法是尝试使用 sun.misc.Unsafe 查看节点/关系对象的起始虚拟地址。获取虚拟地址的程序来自以下链接: How can I get the memory location of a object in java?
public static long addressOf(Object o) throws Exception {
Object[] array = new Object[] { o };
long baseOffset = unsafe.arrayBaseOffset(Object[].class);
int addressSize = unsafe.addressSize();
long objectAddress;
switch (addressSize) {
case 4:
objectAddress = unsafe.getInt(array, baseOffset);
break;
case 8:
objectAddress = unsafe.getLong(array, baseOffset);
break;
default:
throw new Error("unsupported address size: " + addressSize);
}
return (objectAddress);
}
并且在 neo4j 服务器脚本(我的 main() 类)中,我通过 id 获取节点地址并按以下方式打印出地址:
void checkAddr(){
nodeAddr(0);
nodeAddr(1);
nodeAddr(2);
}
void nodeAddr(int n){
Node oneNode = graphDb.getNodeById(n);
Node[] array1 = {oneNode};
try {
long address = UnsafeUtil.addressOf(array1);
System.out.println("Addess: " + address);
} catch (Exception e) {
e.printStackTrace();
}
}
首先,我尝试使用软缓存提供程序,这是默认情况。为节点对象 0、1 和 2 打印出的地址是:
Addess: 4168500044 Addess: 4168502383 Addess: 4168502753
因此,使用第二个地址 - 第一个地址和第三个地址 - 第二个地址,我可以确切地知道节点占用了多少空间。在这种情况下,第一个节点对象占用 2339B,第二个占用 370B。
然后,为了查看禁用对象缓存的影响,我使用 NoCacheProvider 进行了设置:
setConfig(GraphDatabaseSettings.cache_type,NoCacheProvider.NAME)
打印出来的地址是:
Addess: 4168488391 Addess: 4168490708 Addess: 4168491056
与第一种情况类似计算的偏移量是:第一个节点对象占用 2317B,第二个占用 348B。
我的问题来了:
既然我使用同一个图并进行只读查询,为什么同一个节点对象的大小会发生变化?
当我禁用对象缓存时,为什么地址偏移量看起来与存在对象缓存一样?比如在node store文件中,单个节点占用9个字节,我的实验不是这样的。如果我获取节点对象的方式有问题,我怎样才能以正确的方式获取虚拟地址?有什么方法可以具体知道 mmap 节点文件驻留在内存中的什么位置?
我怎么才能准确知道节点对象中存储的内容。当我在这个链接上查看 Node.class 时: https://github.com/neo4j/neo4j/blob/1.9.8/community/kernel/src/main/java/org/neo4j/graphdb/Node.java节点对象看起来不应该与演示幻灯片中的一样。而只是节点对象使用的一组函数。另外,在没有对象缓存和有对象缓存的情况下,一个节点对象是否同时作为一个整体进入内存?
最佳答案
Node
对象不是 Neo4j 存储在“对象缓存”中的对象,因此您不会通过查看这些实例来深入了解 Neo4j 的缓存。 Neo4j 为您提供的 Node
的实现是名为 NodeProxy
的类的实例。 ,并且尽可能小(两个字段:内部 ID 和对数据库的引用)。这些只是作为节点的句柄,用于在数据库中围绕该节点执行操作。存储在“对象缓存”中的对象是名为 NodeImpl
的类的实例。 (尽管有名称,但它们并未实现 Node
接口(interface))。 NodeImpl
对象具有该演示文稿中第 15 张幻灯片(幻灯片中的第 9 页)中概述的形状。好吧,它大致具有那种形状,自从我制作这些幻灯片以来,Neo4j 已经发展。
Neo4j 的发展也改变了节点记录在磁盘上占用的字节数。 Neo4j 2.0 及更高版本的节点记录比那些幻灯片显示的节点记录稍大。如果您有兴趣查看这些记录的布局,您应该查看 NodeRecord
类,然后从NodeStore
开始类并“向下”进入其依赖项以找到内存映射。
除了查看错误的对象以了解 Neo4j 中不同缓存方法之间的差异之外,您的测量方法是有缺陷的。比较对象的地址并不能告诉您有关这些对象大小的任何信息。 JVM 不保证一个接一个(及时)分配的两个对象将在内存中相邻驻留,即使 JVM 确实使用了这样的分配策略,Neo4j 也可能在您分配的两个对象之间分配了多个对象正在比较。然后是垃圾收集器,它可能会在您获取一个对象的地址和获取下一个对象的地址之间移动对象。因此,在 Java 中查看对象的地址几乎没有任何用处。要想更好地测量 Java 中对象的大小,请查看 Java Object Layout utility。 ,或使用 Instrumentation.getObjectSize(...)
method来自 Java 代理。
按照说明回答您的问题:
节点对象的大小没有变化,它们的地址不能保证在两次运行之间相同。根据我上面的描述,您不能依赖对象地址来计算对象大小。
由于您正在查看 NodeProxy
对象,因此无论 Neo4j 使用何种缓存策略,它们看起来都是一样的。为了查看 NodeImpl
对象,您必须深入挖掘 Neo4j 的内部结构。由于看起来您正在使用 Neo4j 1.9,因此您可以将 GraphDatabaseService
实例强制转换为 GraphDatabaseAPI
(实现内部的接口(interface)),然后调用 该对象上的 getNodeManager()
方法。在 NodeManager
中,您可以调用 getNodeIfCached( node.getId() )
来获取 NodeImpl
对象。请注意,此 API 在 Neo4j 的不同版本之间不兼容,使用它是一种“如果密封破损则保修无效”的情况......
改为查看 NodeImpl
的源代码。至于何时以及如何将数据放入缓存,Neo4j 尽量做到偷懒,只加载您使用的数据。如果您正在获取节点的关系,这些将被加载到缓存中,如果您正在获取属性,这些将被加载到缓存中。如果您只获取关系,则永远不会加载属性,反之亦然。
关于java - Neo4j对象缓存的理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25612552/
我已经在 OSX 上安装了 Docker 并下载了 neo 镜像。当我运行它时(使用图像主页中的 args),一切似乎都正常,但日志的最后几行表明如下: 00:20:39.662 [main] INF
我的正则表达式在 neos 项目中不能正常工作。DD/MM/YYYY 的正则表达式(仅限 19XX-20XX) var date_regex = /^(0[1-9]|1\d|2\d|3[01])\/(
Neo 4j可以与HDFS / Hadoop集成吗?在处理涉及许多关系且每秒具有大量事务的大型数据集时,通常使用Hadoop来提高Neo 4j的处理能力。 最佳答案 这是一个非常广泛的问题。也许考虑提
我尝试在 NEO 环境中使用 TenantAccessor。TenantAccessor.getCurrentTenant().getTenantId() 生成的 TenantId 作为 GUID 返
我下载了Neoclipse Source并下载了 Neo4J source 。但是 Neo4J 源文件中找不到 Neoclipse 源文件引用的某些类。它们已被弃用吗?我可以获得 Neoclipse
进程文件: neo or neo.exe 进程名称: Price Patrol 进程类别:存在安全风险的进程 英文描述: neo.exe is the execuatble for Pric
load csv with headers from 'file:///C:/Users/user/Desktop/Neo4J' as row Create (:State_Code {state_c
如何在 SAPUI5 应用程序的运行时为 neo-app.json 文件的 routes 部分定义新条目?例如在 Component.js 内部。 例如,我想将以下条目添加到文件中,或者将一些代码添加
我最近将一台计算机变成了 Ubuntu 服务器。我已经按照下面的文章 http://neos.readthedocs.io/en/stable/GettingStarted/Installation.
我正在尝试了解如何使用 NEOS Server for SCIP .我已经阅读了有关 CPLEX LP file format 的教程.但我仍然得不到任何结果。 让我们以该教程中提供的示例为例: Ma
关于这一年Bubble Cup (完)有问题NEO (我无法解决),它要求 给定一个包含 n 个整数元素的数组。我们把它分成几个部分(可能是1个),每个部分都是一个连续的元素。这种情况下的 NEO 值
我的 Rails 应用程序必须使用 Neo4j。所以我开始安装 neo4j 服务器。我按照步骤安装 here在 Linux 上。 但是当我运行的时候 ./bin/neo4j console 它给了 E
我刚从 windows 10 切换到 arch linux我想使用 (Neo)Vim 作为我的代码编辑器我已经完成了自动编译和模糊查找器但我不知道如何在 (Neo)Vim 中调试 任何帮助! 最佳答案
我想问一下,如何使用Spring boot找到Dijkstra。 我目前使用 spring-boot-starter-data-neo4j 库将 Neo4j 与我的 java 类映射。 我现在想使用
我正在尝试创建一个可以从 U2F token (例如 Java 语言的 Yubikey Neo)检索公钥和私钥的应用程序。我尝试在控制台中使用简单的扫描仪从 Yubikey Neo 获取任何内容,但它
我想用摩托罗拉68000汇编器写一个程序,目标平台是Neo Geo(九十年代的游戏机);这个问题很严重,我有一个我想实现的特定项目并且我有编程经验(虽然我现在主要是 Perl/R 编程,但我以前只接触
我使用自定义 Web 服务作为 neo4j 的非托管扩展。 这是 Neo4j 提供的详细信息,我已遵循该详细信息并创建了自己的非托管扩展。 http://neo4j.com/docs/stable/s
Typo3 Neos 是否原生支持元素的响应行为?例如像 css 网格类(col-sm-?? 或 col-md-??)这样的 Bootstrap ,或者我可以使用 Neos 通过 hidden-xs
我是为嵌入式板构建自定义 Linux 操作系统的新手 - 所以请忽略我的无知。 我有一个名为 NanoPi NEO 的开发板,它具有定制的 Debian Linux。现在开发板附带一个 .img 文件
我正在尝试使用脚本在 NEO4j db 中导入 csv 文件: LOAD CSV FROM "file:///dataframe6.txt" AS line RETURN count(*) 但我收到以
我是一名优秀的程序员,十分优秀!