我有一个特殊的需求,最重要的问题是:
这是我的"问题":我需要在内存中存储大量非常稀疏的位数组.这些位集仅"附加",主要用于交叉点.通过巨大的,我的意思是高达200 000位阵列.
每个位组的范围应在[0 ... 16 000 000]之间.
我用"仅"10个673位数组运行了一些预测试,其中包含了我得到的一些实际数据并得到了以下结果:
1% of the bit arrays ( 106 bit arrays) Hamming weight: at most 1 bit set
5% of the bit arrays ( 534 bit arrays) Hamming weight: at most 4 bits set
10% of the bit arrays ( 1068 bit arrays) Hamming weight: at most 8 bits set
15% of the bit arrays ( 1603 bit arrays) Hamming weight: at most 12 bits set
20% of the bit …Run Code Online (Sandbox Code Playgroud) Eclipse的JDT编译器提供了一个接口INameEnvironment,该接口定义了findType(...)使您能够进行级联编译的方法.奇怪的是我想知道是否有任何方法可以使用标准的JDK编译工具包来做到这一点?
注意,该场景是一个模板引擎,它在内存编译中为模板文件生成的类进行相互依赖,并且它无法预测您遇到模板文件的顺序,因此Foo可能需要先编译才能进行父Bar编译,因此你需要一个机制来进行级联编译,这意味着在编译期间Foo你需要生成另一个源Bar并首先编译它以便继续Foo编译:一些代码如下:
private NameEnvironmentAnswer findType(final String name) {
try {
if (!name.contains(TemplateClass.CN_SUFFIX)) {
return findStandType(name);
}
char[] fileName = name.toCharArray();
TemplateClass templateClass = classCache.getByClassName(name);
// TemplateClass exists
if (templateClass != null) {
if (templateClass.javaByteCode != null) {
ClassFileReader classFileReader = new ClassFileReader(templateClass.javaByteCode, fileName, true);
return new NameEnvironmentAnswer(classFileReader, null);
}
// Cascade compilation
ICompilationUnit compilationUnit = new CompilationUnit(name);
return new NameEnvironmentAnswer(compilationUnit, null);
}
// So it's …Run Code Online (Sandbox Code Playgroud) 我正在使用SQL Server 2014 CTP2,READ_COMMITTED_SNAPSHOT ON(我认为这对问题很重要).
我创建了一个In-Memory表类型(非常类似于technet博客,SQL Server 2014 In Memory OLTP:内存优化表类型和表变量),我有几个内存表.
在查询本身中,我在常规内存表和内存表类型之间有一个连接,充当过滤器,当我执行查询时,我收到此错误消息:"使用READ访问内存优化表的查询当数据库选项READ_COMMITTED_SNAPSHOT设置为ON时,COMMITTED隔离级别无法访问基于磁盘的表.使用表提示(例如WITH(SNAPSHOT))为内存优化表提供支持的隔离级别.
我正在写这个问题时删除了READ_COMMITTED_SNAPSHOT,但问题仍然存在,如果我创建了一个内存数据类型,并且这个特定类型将"永远不会溢出到磁盘",正如博客所说,为什么呢?服务器"看到"它作为"磁盘表?
为了清理,我尝试只使用In-Mem表进行连接并且它可以工作,只要表类型进来我就得到了错误.
更新:当我删除READ_COMMITTED_SNAPSHOT(现在已关闭)时,查询有效,但现在我已经丢失了多版本/无锁定/速度,我想听听另一个解决方案.
谢谢
CREATE DATABASE MemOptimized
GO
ALTER DATABASE MemOptimized
ADD FILEGROUP mofg
CONTAINS MEMORY_OPTIMIZED_DATA
GO
ALTER DATABASE MemOptimized
ADD FILE ( NAME = N'mofg',
FileName = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\MemOptimized.ndf')
TO FILEGROUP mofg
Run Code Online (Sandbox Code Playgroud)
CREATE TYPE [dbo].[tType] AS TABLE(
[C] [int] NOT NULL
INDEX ix NONCLUSTERED HASH (C) WITH (BUCKET_COUNT = 8)
) WITH ( MEMORY_OPTIMIZED = ON )
CREATE TABLE …Run Code Online (Sandbox Code Playgroud) sql-server in-memory user-defined-types sql-server-2014 memory-optimized-tables
我需要能够在 C# 中搜索大约 200 万个项目的集合。应该可以在多个字段上进行搜索。简单的字符串匹配就足够了。
使用像数据库这样的外部依赖不是一种选择,但使用内存数据库就可以了。
主要目标是做到这一点内存高效。
集合中的类型非常简单,没有长字符串:
public class Item
{
public string Name { get; set; } // Around 50 chars
public string Category { get; set; } // Around 20 chars
public bool IsActive { get; set; }
public DateTimeOffset CreatedAt { get; set; }
public IReadOnlyList<string> Tags { get; set; } // 2-3 items
}
Run Code Online (Sandbox Code Playgroud)
明确重点和要求:
使用简单List<T> …
是否有任何可以在嵌入模式下运行的Java数据库,其中一些表存储在内存中,同时从磁盘加载其他表?H2和JavaDB似乎是Java DB的两个领导者,我知道它们都有内存模式,但它们是否会让你将整个数据库加载到内存中,还是可以逐个表决?
我有许多单元测试,它们在内存中使用Apache Derby.我的连接网址是:jdbc:derby:memory:srf.derby;create=true
我发现每次,当标记为@Transactional完成的方法时,我会收到Derby警告
12:53:28:5328 [org.hibernate.util.JDBCExceptionReporter] [main] WARN - SQL Warning: 10000, SQLState: 01J01
12:53:28:5328 [org.hibernate.util.JDBCExceptionReporter] [main] WARN - Database 'memory:srf.derby' not created, connection made to existing database instead.
Run Code Online (Sandbox Code Playgroud)
为什么?我做错了什么?
谢谢
我已经安装了HazelCast 2.5.我想将我的记录保存到磁盘中.我了解到MapStore完成了这项工作.但是我不确定如何实现MapStore.
我编写的代码到目前为止:
public class MyMaps implements MapStore<String,String> {
public static Map<Integer, String> mapCustomers = Hazelcast.getMap("customers");
public static void main(String[] args) {
{
mapCustomers.put(1, "Ram");
mapCustomers.put(2, "David");
mapCustomers.put(3, "Arun");
}
Run Code Online (Sandbox Code Playgroud)
}
如何将所有这些条目放入磁盘.
有必要像MySQL或PostgreSQL这样的后端使用这个类吗?
我相信可以使用以下功能:
public void delete(String arg0);
public void deleteAll(String arg0);
public void store(String arg0);
public void storeAll(String arg0);
Run Code Online (Sandbox Code Playgroud)
我需要一个如何实现MapStore的示例片段.
请提供示例代码.
请帮忙.!!
我想知道是否有一个可以处理MDX 的内存 OLAP服务器.
我找到了维基百科的文章.但它没有说明内存功能......
我所知道的唯一一个是Mondrian,它也是上面wiki文章中提到的两个开源解决方案之一.
到目前为止,我刚刚和蒙德里安合作了......我不认为Mondrian是一个真正的内存OLAP服务器.
原因如下:
它有一个内存缓存,其中包含查询结果.但是他们的第一次执行需要很长时间,必须从RDBMS加载.(http://mondrian.pentaho.com/documentation/faq.php#Scalability)
我认为最好的方法是:
在Cache中加载所有的事实和维度表,然后对这个内存中的数据执行每个查询.
AFAIK,甲骨文将在今年发布12c企业版,有可能在内存中拥有一些(或所有)表.这将加速OLAP服务器,它只使用SQL查询RDBMS-fact-tables.
...但企业版非常昂贵......
我想听听其他一些意见.
最好的问候,
丹尼斯.
所以我最近了解到JDK 1.6中提供的新JavaCompiler API.这使得直接从运行代码编译String到.class文件变得非常简单:
String className = "Foo";
String sourceCode = "...";
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
List<JavaSourceFromString> unitsToCompile = new ArrayList<JavaSourceFromString>()
{{
add(new JavaSourceFromString(className, sourceCode));
}};
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
compiler.getTask(null, fileManager, null, null, null, unitsToCompile).call();
fileManager.close();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
FileInputStream fis = new FileInputStream(className + ".class");
IOUtils.copyStream(fis, bos);
return bos.toByteArray();
Run Code Online (Sandbox Code Playgroud)
您可以JavaSourceFromString从Javadoc获取源代码.
这将非常方便地编译sourceCode到Foo.class当前工作目录中.
我的问题是:是否可以直接编译到byte[]数组,并避免File完全处理I/O 的混乱?
我有一个系统,它在收到消息后 - 将其排队(写入表),另一个进程轮询数据库并将其出列以进行处理.在我的自动测试中,我已经在同一个过程中合并了操作,但是不能(在概念上)合并来自两个操作的NH会话.
自然 - 出现问题.
我已经阅读了关于让SQLite-InMemory-NHibernate组合在测试环境中工作的一切,但由于"没有这样的表"错误,我现在遇到了随机测试失败.为了说清楚 - "随机"意味着具有相同确切配置和代码的相同测试有时会失败.
我有以下SQLite配置:
return SQLiteConfiguration
.Standard
.ConnectionString(x => x.Is("Data Source=:memory:; Version=3; New=True; Pooling=True; Max Pool Size=1;"))
.Raw(NHibernate.Cfg.Environment.ReleaseConnections, "on_close");
Run Code Online (Sandbox Code Playgroud)
在我的测试开始时(每次测试),我获取"静态"会话提供程序,并请它刷新现有的数据库清理,并重新创建模式:
public void PurgeDatabaseOrCreateNew()
{
using (var session = GetNewSession())
using (var tx = session.BeginTransaction())
{
PurgeDatabaseOrCreateNew(session);
tx.Commit();
}
}
private void PurgeDatabaseOrCreateNew(ISession session)
{
//http://ayende.com/Blog/archive/2009/04/28/nhibernate-unit-testing.aspx
new SchemaExport(_Configuration)
.Execute(false, true, false, session.Connection, null);
}
Run Code Online (Sandbox Code Playgroud)
所以是的,它是在不同的会话上,但是连接是在SQLite上汇集的,所以我创建的下一个会话将看到生成的模式.然而,虽然大多数时候它都有效 - 但有时后来的"入队"操作会失败,因为它无法看到我传入消息的表格.此外 - 每个测试套件运行似乎最多发生一次或两次; 并非所有的测试都失败了,只是第一个(有时是另一个.不太确定它是否是第二个).
最糟糕的是随机性,自然而然.我告诉自己我现在已经修好了几次,只是因为它只是"停止了失败".随意.
这种情况发生在FW4.0,System.Data.SQLite x86版本,Win7 64b和2008R2(总共三台不同的机器),NH2.1.2,配置了FNH,在TestDriven.NET 32b precesses和NUnit控制台32b进程上.
救命?
in-memory ×10
java ×3
algorithm ×1
bitarray ×1
c# ×1
classloader ×1
classpath ×1
compilation ×1
compression ×1
database ×1
derby ×1
hazelcast ×1
javadb ×1
jsr199 ×1
mdx ×1
mondrian ×1
nhibernate ×1
olap ×1
optimization ×1
performance ×1
sql-server ×1
testing ×1