标签: in-memory

算法:非常稀疏的位数组的巨大数量,编码使用

我有一个特殊的需求,最重要的问题是:

  • 在记忆中
  • 内存占用非常低
  • 速度

这是我的"问题":我需要在内存中存储大量非常稀疏的位数组.这些位集仅"附加",主要用于交叉点.通过巨大的,我的意思是高达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)

compression algorithm bitarray in-memory

10
推荐指数
1
解决办法
5324
查看次数

使用javax.tool级联内存编译

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)

java compiler-construction classpath classloader in-memory

10
推荐指数
1
解决办法
624
查看次数

内存中用户定义的表,不在内存中?

我正在使用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

10
推荐指数
2
解决办法
3920
查看次数

C#:内存高效搜索 200 万个对象,无需外部依赖

我需要能够在 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)

重点和要求

明确重点和要求:

  • 没有外部依赖(如数据库)
  • 内存高效(200 万个项目低于 2 GB)
  • 集合中的可搜索项目(必须是高性能的)

今天的非最优解

使用简单List<T> …

c# optimization performance memory-management in-memory

10
推荐指数
2
解决办法
1015
查看次数

内存中的Java DB

是否有任何可以在嵌入模式下运行的Java数据库,其中一些表存储在内存中,同时从磁盘加载其他表?H2和JavaDB似乎是Java DB的两个领导者,我知道它们都有内存模式,但它们是否会让你将整个数据库加载到内存中,还是可以逐个表决?

database in-memory in-memory-database javadb

9
推荐指数
1
解决办法
1万
查看次数

在内存中使用Apache Derby时出现警告

我有许多单元测试,它们在内存中使用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)

为什么?我做错了什么?

谢谢

derby in-memory

9
推荐指数
1
解决办法
5488
查看次数

使用Hazelcast在磁盘上保留数据

我已经安装了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的示例片段.

请提供示例代码.

请帮忙.!!

java in-memory hazelcast

9
推荐指数
2
解决办法
2万
查看次数

是否有(开源)基于MDX的内存OLAP服务器?

我想知道是否有一个可以处理MDX 的内存 OLAP服务器.

我找到了维基百科的文章.但它没有说明内存功能......

我所知道的唯一一个是Mondrian,它也是上面wiki文章中提到的两个开源解决方案之一.

到目前为止,我刚刚和蒙德里安合作了......我不认为Mondrian是一个真正的内存OLAP服务器.
原因如下:
它有一个内存缓存,其中包含查询结果.但是他们的第一次执行需要很长时间,必须从RDBMS加载.(http://mondrian.pentaho.com/documentation/faq.php#Scalability)
我认为最好的方法是:
在Cache中加载所有的事实和维度表,然后对这个内存中的数据执行每个查询.

AFAIK,甲骨文将在今年发布12c企业版,有可能在内存中拥有一些(或所有)表.这将加速OLAP服务器,它只使用SQL查询RDBMS-fact-tables.
...但企业版非常昂贵......

我想听听其他一些意见.

最好的问候,
丹尼斯.

olap mdx in-memory mondrian in-memory-database

9
推荐指数
1
解决办法
4713
查看次数

来自JDK 1.6的JavaCompiler:如何将类字节直接写入byte []数组?

所以我最近了解到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)

您可以JavaSourceFromStringJavadoc获取源代码.

这将非常方便地编译sourceCodeFoo.class当前工作目录中.

我的问题是:是否可以直接编译到byte[]数组,并避免File完全处理I/O 的混乱?

java compilation in-memory jsr199

8
推荐指数
1
解决办法
2155
查看次数

在内存中的SQLite数据库中使用NHibernate进行测试时出现随机错误

我有一个系统,它在收到消息后 - 将其排队(写入表),另一个进程轮询数据库并将其出列以进行处理.在我的自动测试中,我已经在同一个过程中合并了操作,但是不能(在概念上)合并来自两个操作的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进程上.

救命?

testing nhibernate system.data.sqlite in-memory

8
推荐指数
1
解决办法
944
查看次数