level cache是一个golang编写支持分片存储的多级的缓存库。整体设计上在保障性能够用的前提下尽可能的通过设计方案简化代码实现,便于维护和二次开发。该库能够管理多种速度价格不同的设备进行对象分片的功能,实现性能和价格的平衡。level cache以分片为粒度进行数据的存储和热点管理,方便类似视频的数据进行分段缓存。
 

项目地址

github: https://github.com/GhostZCH/levelcache
文档: http://www.zhaoch.top/项目/level_cache.html

特色功能

  • 支持多级缓存,自动将热点分片移动到高级别的设备中,并优先读取
  • 任何可以挂载为linux目录的设备都可以被使用,例如内存可以使用/dev/shm/作为缓存路径
  • 以分片为粒度存储,方便只缓存部分数据后将对象的一部分放到更高级别的设备中
  • 调用者可以实现Auxiliary接口来存储附加对象信息,这些信息能够方便调用者进行更多的判断和统计,同时通过Auxiliary可以实现自定义批量删除,诸如按照类型,正则表达式,分组,前后缀的删除都是可以实现的
  • 块文件在初始化时通过mmap加载,合理使用可减少内存拷贝

接口

Cache操作

NewCache
初始化一个新的缓存对象
// devices: 设备配置,级别依次升高,基本越高的设备速度应该越快
func NewCache(conf Config, devices []DevConf) *Cache

Close()
关闭,保存文件,关闭句柄
 
Dump()
保存元数据,建议周期性的调用,防止程序意外退出造成较大损失
 
示例:
conf := cache.Config{
    MetaDir:        "/tmp/cache/meta/",
    ActionParallel: 4,
    AuxFactory:     NewHttpAux}
devices := [3]cache.DevConf{
    cache.DevConf{
        Name:     "hdd",
        Dir:      "/tmp/cache/hdd/",
        Capacity: 1000 * 1024 * 1024},
    cache.DevConf{
        Name:     "ssd",
        Dir:      "/tmp/cache/ssd/",
        Capacity: 100 * 1024 * 1024},
    cache.DevConf{
        Name:     "mem",
        Dir:      "/tmp/cache/mem/", //实际可以使用而 /dev/shm/xxxx/
        Capacity: 10 * 1024 * 1024},
}
c := cache.NewCache(conf, devices[:])
defer c.Close()
go func() {
    time.Sleep(time.Minute)
    c.Dump()
}()

  

对象操作


Get
// 获得缓存对象某一部分的数据,end = -1 时表示获取到数据文件末尾,每次get后相应的数据分片可能会被调整到速度更快的缓存设备中
// dataList: 数据分片的列表
// hitDevs: 命中的
// missSegments: 示缺失的数据分片,每个元素[2]int的内容是对应分片的start与end
func (c *Cache) Get(key Hash, start int, end int) (dataList [][]byte, hitDevs []string, missSegments [][2]int) 

 


AddItem
// 增加一个缓存对象,只包含基础信息,不包含缓存数据和分片
func (c *Cache) AddItem(key Hash, expire, size int64, auxData interface{})
 
AddSegment
// 添加一个分片
func (c *Cache) AddSegment(key Hash, start int, data []byte)
 
Del
// 删除一个对象,包含所属的分片
func (c *Cache) Del(k Hash)

 

DelBatch
// 批量删除,根据设置的并行数n, 每次读锁定n个桶进行匹配返回key,之后加写锁对这些key进行单个删除
func (c *Cache) DelBatch(m Matcher)

 

示例
pngkey := md5.Sum([]byte("http://www.test.com/123/456/1.png"))
png := []byte("this is 1.png")
c.AddItem(pngkey, time.Now().Unix()+3600, int64(len(jpg)), httpAuxData{
    fileType: crc32.ChecksumIEEE([]byte("png")),
    rawKey:   []byte("http://www.test.com/123/456/1.png")})
c.AddSegment(pngkey, 0, png)
c.Del(pngkey)
c.DelBatch(func(aux cache.Auxiliary) []cache.Hash {
    keys := make([]cache.Hash, 0)
    for k, v := range aux.(*httpAux).datas {
        if v.fileType == crc32.ChecksumIEEE([]byte("jpg")) {
            keys = append(keys, k)
        }
    }
    return keys
})
 

类型定义

 // 存储key
type Hash [md5.Size]byte
// 批量删除的回调函数,用于批量删除时在用户自定义数据中查找需要删除的数据,每个桶执行一次,不需要调用者加锁
type Matcher func(aux Auxiliary) []Hash
// 设备初始化配置
type DevConf struct {
    Name     string
    Dir      string
    Capacity int
}
// 缓存库公共配置
type Config struct {
    MetaDir        string       // 元数据文件存放的目录建议放在非易失存储上
    ActionParallel int      // 批量删除和备份元数据等批量耗时操作的并发数,建议设置为cpu数的一半
    AuxFactory     AuxFactory  // 产生附加数据的工厂函数,meta中的每个桶会包含一个自定义附加数据,用于方便删除
}
// 产生附加数据的工厂函数,用作新建缓存的参数
type AuxFactory func(idx int) Auxiliary

// 调用者附加数据接口,由调用者根据业务情况设计数据结构实现相关的方法,不需要调用者加锁
type Auxiliary interface {
    Add(key Hash, auxItem interface{})
    Get(key Hash) interface{}
    Del(key Hash)
    Load(path string) // 从指定文件加载内容,NewCache时触发,每个桶触发一次,path不同
    Dump(path string)  // 向指定文件持久化数据,
}

 

示例

详见example/main.go

type httpAuxData struct {
    fileType  uint32
    etagCRC   uint32
    rawKey    []byte
}
type httpAux struct {
    datas map[cache.Hash]httpAuxData
}
func (aux *httpAux) Add(key cache.Hash, auxItem interface{}) {
    aux.datas[key] = auxItem.(httpAuxData)
}
func (aux *httpAux) Get(key cache.Hash) interface{} {
    data, _ := aux.datas[key]
    return data
}
func (aux *httpAux) Del(key cache.Hash) {
    delete(aux.datas, key)
}
func (aux *httpAux) Load(path string) {
    return
}
func (aux *httpAux) Dump(path string) {
    return
}
func NewHttpAux(idx int) cache.Auxiliary {
    return &httpAux{datas: make(map[cache.Hash]httpAuxData)}
}
func main() {
    // 初始化存储
    conf := cache.Config{
        MetaDir:        "/tmp/cache/meta/",
        ActionParallel: 4,
        AuxFactory:     NewHttpAux}
    // 大容量存储在前,快速存储在后,最低级存储建议用非易失存储
    devices := [3]cache.DevConf{
        cache.DevConf{
            Name:     "hdd",
            Dir:      "/tmp/cache/hdd/",
            Capacity: 1000 * 1024 * 1024},
        cache.DevConf{
            Name:     "ssd",
            Dir:      "/tmp/cache/ssd/",
            Capacity: 100 * 1024 * 1024},
        cache.DevConf{
            Name:     "mem",
            Dir:      "/tmp/cache/mem/", //实际可以使用而 /dev/shm/xxxx/
            Capacity: 10 * 1024 * 1024},
    }
    c := cache.NewCache(conf, devices[:])
    defer c.Close()
    go func() {
        time.Sleep(time.Minute)
        c.Dump()
    }()
    // 添加一个对象
    fmt.Println("add jpg")
    jpgkey := md5.Sum([]byte("http://www.test.com/123/456/1.jpg"))
    jpg := []byte("this is 1.jpg")
    c.AddItem(jpgkey, time.Now().Unix()+3600, int64(len(jpg)), httpAuxData{
        fileType: crc32.ChecksumIEEE([]byte("jpg")),
        rawKey:   []byte("http://www.test.com/123/456/1.jpg")})
    c.AddSegment(jpgkey, 0, jpg)
    // 热点数据升级到更快的存储中
    fmt.Println(c.Get(jpgkey, 0, -1)) // hdd
    fmt.Println(c.Get(jpgkey, 0, -1)) // ssd
    fmt.Println(c.Get(jpgkey, 0, -1)) // mem
    // 添加另一个对象
    fmt.Println("add png")
    pngkey := md5.Sum([]byte("http://www.test.com/123/456/1.png"))
    png := []byte("this is 1.png")
    c.AddItem(pngkey, time.Now().Unix()+3600, int64(len(jpg)), httpAuxData{
        fileType: crc32.ChecksumIEEE([]byte("png")),
        rawKey:   []byte("http://www.test.com/123/456/1.png")})
    c.AddSegment(pngkey, 0, png)
    fmt.Println(c.Get(jpgkey, 0, -1))
    // 删除类型为jpg的文件
    fmt.Println("Del jpg")
    c.DelBatch(func(aux cache.Auxiliary) []cache.Hash {
        keys := make([]cache.Hash, 0)
        for k, v := range aux.(*httpAux).datas {
            if v.fileType == crc32.ChecksumIEEE([]byte("jpg")) {
                keys = append(keys, k)
            }
        }
        return keys
    })
    // 按照正则删除文件
    fmt.Println("Del regex")
    r := regexp.MustCompile(`http://www.test.com/123/.*png`)
    c.DelBatch(func(aux cache.Auxiliary) []cache.Hash {
        keys := make([]cache.Hash, 0)
        for k, v := range aux.(*httpAux).datas {
            if r.Match(v.rawKey) {
                fmt.Println("match", string(v.rawKey))
                keys = append(keys, k)
            }
        }
        return keys
    })
}

 

 

设计

主要对象的结构如下

 

 

  • Cache包含Meta和一个Device组成的数组
  • Meta用于存储item的基础信息和Aux信息,Meta被分成256个桶,对象按照key的第一个byte判断在哪个桶中。每个桶各自独立,有独立的锁,每次只锁定1/256的数据,减少批量删除和持久化操作对整个系统的影响
  • Device数组按照存储级别由低到高设置,高级别时更快的设备。每个设备主要包含两部分内容,store用于管理存储空间分配和回收。buckets用于管理segment的元数据信息,也采用了和Meta类似的分桶逻辑减少锁对系统平稳的影响。为了减少代码量,所有的Device配置都使用linux目录方式,也就是不论内存、ssd、hdd或者是nfs,都可以复用同一套管理代码,只要可以被挂载为linux目录即可
  • Auxiliary是一个由使用者实现的借口,方便调用者按照自身的业务逻辑进行批量删除等操作,每MetaBucket会实例化一个,由库保证线程安全
 

 

 

device的内部结构如上图,只以HDD为例画出一个,所有device具有相同的管理逻辑
  • device内主要由segments(处于buckets内)和store组成,
  • Store采用FIFO大文件块队列的方式进行内容存储,每个块存储若干文件,当空间不够时,会新增一个文件块并删除一个旧块,新增加的存储位于文件块的末尾

for spiders
www.zhaoch.top
https://github.com/GhostZCH/levelcache
http://www.zhaoch.top/项目/level_cache.html
posted @ 2020-05-25 08:58 Ghost_zhao 阅读(1524) 评论(0) 推荐(0)
摘要: 原文 http://www.zhaoch.top/操作系统/linux/不停服更新二进制文件.html 不停服更新二进制文件 www.zhaoch.top > 操作系统 > linux 虽然目前分布式架构和keepalived等工具的存在,对于某些特殊的程序,仍然需要不停服更新二进制文件。 这里参考 阅读全文
posted @ 2018-09-12 20:25 Ghost_zhao 阅读(773) 评论(0) 推荐(0)
摘要: http://www.zhaoch.top/操作系统/linux/热替换so文件.html 热替换so文件 www.zhaoch.top > 操作系统 > linux 发现nginx的动态模块无法热更新,于是研究了一下相关的问题。 代码准备 reload.c, 启动文件,用来模拟正在运行的程序,不断 阅读全文
posted @ 2018-09-12 20:22 Ghost_zhao 阅读(3295) 评论(0) 推荐(0)
摘要: 博客更换至 www.zhaoch.top 随手拷了一些链接 http://www.zhaoch.top/操作系统/linux/常用命令备忘.html http://www.zhaoch.top/操作系统/linux/常用命令备忘.html http://www.zhaoch.top/操作系统/lin 阅读全文
posted @ 2018-09-06 10:17 Ghost_zhao 阅读(362) 评论(0) 推荐(0)
摘要: 最近看一本设计模式,自己抽空实现了一下,分享一下,最忌比较忙,就不细说了,先把代码放在这里,之后补上注释。书上把设计模式分为创建型,结构型和行为型,本次先来创建型。(一),抽象工厂模式AbsractFactory头文件#ifndef_ABS_FACTORY_H_#define_ABS_FACTORY... 阅读全文
posted @ 2015-04-18 12:26 Ghost_zhao 阅读(432) 评论(1) 推荐(0)
摘要: 1#include2#include3#include45pthread_mutex_tmutex;6pthread_cond_tcond_full;7pthread_cond_tcond_empty;89intg_iBufSize=0;1011void*thread_producer(void*a... 阅读全文
posted @ 2015-04-12 23:52 Ghost_zhao 阅读(863) 评论(0) 推荐(0)
摘要: 代码:CXX:=g++CFLAGS:=-gTARGET:=xxx.exeSRCS:=$(wildcard*.cpp)OBJS:=$(patsubst%cpp,%o,$(SRCS))all:$(TARGET)%.o:%.cpp$(CXX)$(CFLAGS)-c$<$(TARGET):$(OBJS)$(... 阅读全文
posted @ 2015-04-12 23:50 Ghost_zhao 阅读(2291) 评论(0) 推荐(0)
摘要: 最短路是个老问题了,大神们留下很多文档但是很多都是针对算法使用一些固定大小的数组进行数据存储在实际应用中受到限制,这里自己练习一下,主要用了一些c++的stl,减少了固定长度数组的依赖,换一种写法试图提高可读性。有兴趣的同学可以试着将map/set 换成 hash_set/hash_map 应该能获... 阅读全文
posted @ 2015-03-08 12:37 Ghost_zhao 阅读(2672) 评论(0) 推荐(0)
摘要: 在C#和Java中都有存在decimal类似的十进制数字,C++中尚未发现,春节假期忙里抽闲写了一个玩玩,时间紧迫没有测试,只能保证编译通过。抛砖引玉,欢迎大家多提建议当前缺陷:1. 除法功能没有实现2. 没有测试3. 代码比较乱没有重构,部分命名不规范4. 算法效率比较低老规矩直接上代码:VS 2... 阅读全文
posted @ 2015-02-23 11:37 Ghost_zhao 阅读(3112) 评论(1) 推荐(0)
摘要: 都知道C语言是面向过程的,但是现在软件规模越来越大,通过面向对象的方式可以简化开发。业余时间想了个简单的方法,在C中使用一部分面向对象的基本功能。由于C语言自身的限制,并不完善,只能将就用,聊胜于无,如果大家有好的想法可以一起讨论。 首先还是老规矩上代码:http://files.cnblogs.... 阅读全文
posted @ 2014-09-08 11:52 Ghost_zhao 阅读(610) 评论(0) 推荐(0)
摘要: 这段时间google上有个小游戏挺火的,我也很喜欢,业余时间做个C语言版的。老规矩先上干货:http://files.cnblogs.com/GhostZCH/2048.rar(.c & .exe)最近在忙毕业设计, 写的不是很好,可能还有不少bug,待优化的地方也不少。还望各位大侠多多指正,不吝赐教。方向键控制,r键重启,esc退出。界面截图如下:以向上移动为例说明移动命令的处理:首先现有一个将格子的数字移动一步的函数:1//********************************************2//Method:MoveOneStep3//Description: 阅读全文
posted @ 2014-03-30 16:59 Ghost_zhao 阅读(3415) 评论(1) 推荐(2)
摘要: 以后要搞C了先自己练习一下,系统本身没有太大的实际用途,只是用来磨练编程规范,不足之处还望大家多多指正。互相交流共同进步。为了方便只使用了一个 book.c 文件,在vc6 下编译通过,其他编译器还没试过文件链接 : http://files.cnblogs.com/GhostZCH/Book.rar顺便贴出代码11/************************************************************************/2/**/3/*该文件是一个模拟的图书借还系统,通过命令行操作*/4/**/5/*命令:*/6/*1.重启:reboot*/7/*2. 阅读全文
posted @ 2014-01-08 14:10 Ghost_zhao 阅读(920) 评论(0) 推荐(0)
摘要: 1遍历所有属性var person={fname:"John",lname:"Doe",age:25}; for (x in person) { txt=txt + person[x]; }2.array 有 lenth 属性 var arr = new Array(); var len = arr.lenth;3 === 类型也相同4 访问属性的两种方法objectName.propertyName objectName["propertyName"]5 支持 try catch throw6 isNaN(x) 判断是否数字7 当你 阅读全文
posted @ 2013-07-12 20:54 Ghost_zhao 阅读(467) 评论(1) 推荐(1)
摘要: 1.每个MFC程序包含一个可执行程序类取名theApp,继承CWInApp例如:classCMFCButtonTestApp:publicCWinApp。2.对话框通常继承CDialog,包含数个控件,可通过拖拽增添控件,可通过属性设置控件外观,同时通过属性窗口绑定控件的事件。3.弹出框:MessageBox(L"OnBnDoubleclickedButton1");4.窗口可增加消息,更多的事件5.选中类可为这个类添加事件和消息6.MFC类中函数的来源主要有三个,响应消息,响应事件,覆盖父类方法7.MFC单文档和多文档中View和Doc类相关,View通过GetDocum 阅读全文
posted @ 2013-04-28 11:38 Ghost_zhao 阅读(403) 评论(0) 推荐(0)
摘要: 1.c++中的类型转换static_cast、dynamic_cast、reinterpret_cast、和const_cast,详见:http://wenku.baidu.com/view/a9356b80d4d8d15abe234e32.html2.指针的指针使用例如:Item**itemList=NULL;itemList=newItem*[n]//初始化一个长度为n的Item*类型的空间,要求Item有默认构造函数for(inti=0;i<n;i++)itemList[i]=newItem();//初始化每一个指针//释放过程for(inti=0;i<n;i++)delet 阅读全文
posted @ 2013-04-28 11:36 Ghost_zhao 阅读(547) 评论(0) 推荐(0)
摘要: 很久之前就想做一个坦克大战,尝试着用WPF做了一部分,后来放弃了,或者说失败了。之前的失败给了自己很多启示,想要的内容太多,心太高,能力有限,结果只有失败。从那之后养成了很多习惯:每回自己做东西都要仔细的计划一下设计一下,即使不规范的写文档心里也要有数;在大程序开始前,先做一些小程序验证一下可能遇到的技术问题是不是都能解决,免得做了多一半才发现有些问题是根本不可能解决的;先把最基础个功能实现,不急于实现那些不重要的细枝末节,验证整体结构的可行性,细小的功能再以后的迭代中逐步添加上去,将每一步的风险都降低;架构先行,将不同功能的代码分割开来,不同的模块分别进化,减少风险。放寒假回家就开始动手.. 阅读全文
posted @ 2013-04-10 16:14 Ghost_zhao 阅读(17702) 评论(8) 推荐(2)
摘要: 想了一个寻路算法,用C++实现了一下,界面用MFC完成的很简单。用20x20的方形区域作为迷宫,为了方便,随机选取了大约1/3的格子作为路障,禁止通过。规则是在只能想前后左右四个方向移动的前提下找到从入口(默认左上角)到出口(默认右下角)的最短路径。 源代码下载:http://files.cnblogs.com/GhostZCH/MFCMaze.rar(如果你下载了,希望你能留下只言片语,哪怕是“+1”也好,谢谢) 说来这个算法也不算难,借鉴了路由器建立路由表的算法,更加简化一些。熟悉TCP/IP协议的筒子们一定会记得路由表建立的原来,这个算法也一样,把每一个单元看成一个路由器,在它上... 阅读全文
posted @ 2013-03-18 10:47 Ghost_zhao 阅读(14376) 评论(11) 推荐(12)
摘要: 花了两天时间做了一个MFC的扫雷,简单的实现了扫雷的功能,界面很草小毛病很多(比如标题。。),还望大家多多指正。开发工具: VS2008代码:http://files.cnblogs.com/GhostZCH/FindMine.rar界面如下,红色的是标记,绿色的是还没有打开的各种,黄色的是已经打开的,红星是地雷(原谅程序的丑陋,唉,我也不是做美工的。。)类图如下,主要是MineItem,MineGrid,MineView 三个类其他的基本都是自动生成的没做多大修改。MineItem和MineGird是逻辑上的格子单元和整个格子,游戏的主要逻辑操作都在MineGrid中完成,View至负责和用 阅读全文
posted @ 2013-03-12 19:18 Ghost_zhao 阅读(6740) 评论(2) 推荐(1)
摘要: 1.C++内存使用分为堆、栈:栈是相对静态的,系统自动释放,一般是固定大小,固定位置的,如inta,doubled,int[100]等,堆是相对动态的,通常有new,malloc行为产生,系统不会自动释放堆的内存。Delete会触发析构函数。例如:voidTest(){Intx=1;//函数执行后自动释放Int*p=newint(1);//函数执行后不会自动释放需要手动释放;Delete(p);//释放P=NULL;//如果后面还有进一步操作必须至NULL在应用时检测是否为空!}2.C++的变量不会自动初始化,需要手动初始化。例如:intx=0。对于全局或是静态的变量,声明时就要初始化,因为不 阅读全文
posted @ 2013-02-09 22:07 Ghost_zhao 阅读(725) 评论(5) 推荐(1)
摘要: 没有钱出去玩,也没有女友需要陪,作为一个宅宅的程序员,假期越长显得越无聊,于是拿出电脑,熟练的打开visual studio打发一下无聊的时间。 一直想学学c++都抽不出时间,借十一小长假自娱自乐一下。凭借本人多年上当受骗经验,靠看书学编程几乎是不可能的,于是乎给自己定了一个小任务做一个俄罗斯方块,边干边学。同学们七嘴八舌的建议我用MFC,基于对话窗的小项目,我就从了他们。 程序本身并没有什么,简简单单,还有一些这样那样的问题,只不过是本人的第一个c++项目,从一个初学者的角度和大家聊聊。 代码已经上传:http://files.cnblogs.com/GhostZCH/Box.rar ,.. 阅读全文
posted @ 2012-10-07 20:45 Ghost_zhao 阅读(9970) 评论(4) 推荐(3)
摘要: C#有自动回收内存的机制,但是有时自动回收有一定滞后,需要在变量使用后迅速回收,节约内存,这里介绍一个最简单的方法。1.先对对象赋值 null;2.System.GC.Collect();代码样例: 1 class Program 2 { 3 static void Main(string[] args) 4 { 5 long lenth = 1024 * 1024 * 128; 6 7 GetCost("程序启动"); 8 9 double[] data = new doubl... 阅读全文
posted @ 2012-09-18 17:30 Ghost_zhao 阅读(15870) 评论(1) 推荐(5)
摘要: 原则上,在C#中最好不用指针,更安全也更方便,但是有时使用指针是速度更快,这里简单介绍一下使用指针访问数组。先在设置里允许可以使用不安全代码:在使用指针时先在函数返回类型前声明该函数实际unsafe的,与C++不同,C#不能直接定义指针,只能放在fixed中,并且指针的有效域也只能在fixed程序段中。写了一小段代码访问数组元素,代码如下。arr1与arr2是两个整数数组,在fixed程序段中依次访问其中的元素。注意:使用指针是有风险的,与正常访问不同,系统少做了一些校验,这也是指针较快的原因,除非对效率有极高要求还是不建议使用指针的。指针的使用与C&C++类似(一般要开指针的对这两种 阅读全文
posted @ 2012-09-18 15:31 Ghost_zhao 阅读(979) 评论(7) 推荐(0)
摘要: MeshGeometry3D时WPF中的一种3d显示类,之前有人发帖解决了从3dmax文件自动生成MeshGeometry3D的方法(http://www.cnblogs.com/enjoyeclipse/archive/2012/03/21/2410439.html)。这里反其道而行发布一种将MeshGeometry3D模型导出到obj文件格式可以使用3dmax打开查看。内容如下: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using... 阅读全文
posted @ 2012-06-14 18:45 Ghost_zhao 阅读(2962) 评论(0) 推荐(1)
摘要: BitmapSource 是WPF中图片的核心类型,读、写、显示都很常用,下面所有的操作都是以这个类型为核心的。从文件读如图片到BitmapSource 类型: 1 private BitmapSource GetSource() 2 { 3 BitmapSource result = null; 4 5 OpenFileDialog dialog = new OpenFileDialog(); 6 dialog.Filter = "常用位图(*.bmp;*.jpg;*.png)|*.bmp;*.jpg;*.png"; 7 8 if (true == dialog... 阅读全文
posted @ 2012-04-08 15:46 Ghost_zhao 阅读(4032) 评论(1) 推荐(1)
摘要: 最近搞了个小程序需要用到FFT,可是找来找去都没有一种C#下可靠地FFT代码,而且速度也不能令人满意。发现MIT做过一个很好的C++类库(http://www.fftw.org/)可以比较好的解决FFT的问题而且运算速度号称世界最快的(虽然未经验证,不过的确很快)。于是研究起在C#中调用C++的dll。1. 在 C#中调用C++首先要包装,将C++中的方法包装成C#下的方法,下面这个不是我写的,但过程都是这个,"libfftw3-3.dll" 文件名,"fftw_malloc"c++函数名,其他参数可以参照VS的帮助选择。记得 using System. 阅读全文
posted @ 2012-04-08 15:21 Ghost_zhao 阅读(8745) 评论(0) 推荐(5)
摘要: WPF自定义按键实现窗口的关闭、最小化和拖动 1 private void Grid_MouseMove(object sender, MouseEventArgs e) 2 { 3 if (e.LeftButton == MouseButtonState.Pressed) this.DragMove(); 4 } 5 6 private void ItmMin_Click(object sender, RoutedEventArgs e) 7 { 8 this.WindowState = WindowState.Minimized; 9 } 10 11 private... 阅读全文
posted @ 2012-04-08 14:11 Ghost_zhao 阅读(673) 评论(0) 推荐(0)
摘要: 之前用业余时间开发了一个电话本小程序(http://www.cnblogs.com/GhostZCH/archive/2011/11/25/2263705.html),开发之后有一些待改善的问题,放假回家又用了一些时间开发了 2.0,改善了其中的一些问题。 安装包下载:http://files.cnblogs.com/GhostZCH/PhoneII_Setup.rar一、程序的基本信息:开发工具: VS2010; 大 小 :安装包700k; 有效代码:2200行左右(有一部分是用自制工具生成的http://www.cnblogs.com/GhostZCH/archive/2012/01/.. 阅读全文
posted @ 2012-01-27 23:45 Ghost_zhao 阅读(656) 评论(0) 推荐(0)
摘要: 主窗口单个属性编辑窗口生成的代码文件生成的代码 :1. AbstractRecordFactory.cs(不允许开发人员修改) 1 //生成时间:2012/1/13 10:44:59 2 using System; 3 using System.Collections.Generic; 4 using PhoneIIModles.DataTools; 5 6 namespace PhoneIIModles.Record 7 { 8 public abstract class AbstractRecordFactory 9 { 10 prote... 阅读全文
posted @ 2012-01-13 11:01 Ghost_zhao 阅读(4717) 评论(0) 推荐(0)
摘要: 这周花了几天业余时间开发了一个电话本的小程序。 程序虽然很小,很简单,也很丑陋,但是确实本人开发的第一个完整的可用的App。构思,编码,简单的测试,直到制成安装包都是一个人完成。以前虽然也写了不少C#和java代码(几万行吧),也写过无数的C和C++的小玩意,但要么是只完成大项目的很小一部分,要么就是那种没啥意思的“hello world!”测试算法的可行性。 程序的基本信息:开发工具: VS2010; 大 小 :安装包500k; 有效代码:500行左右; 架 构 :.NET 4.0 Client Prifile; 主要技术:XML 读写,WPF 界面制作; 开发时间:大约不到20小时吧,估. 阅读全文
posted @ 2011-11-25 22:22 Ghost_zhao 阅读(1650) 评论(2) 推荐(0)
摘要: 1.数组矩阵的赋值:a=[12345]向量a=(1,2,3,4,5)a=[123;456;789]3*3矩阵a=[123456789]回车与“;”效果一致a=0:1:100注意:是0到100共101个分量a=100:-1:0亦可a=linspace(0,10,6)生成0到10之间的6个数(包括0和10)(0,2,4,6,8,10)a=logspace(0,5,6)生成0到5之间的六个数(包括0和5)再取以10为底的指 数结果是(1,10,100,1000,10000,100000)特殊矩阵eyeoneszerosrandrandnmagic。通过a(n,m)的方法访问或都每一个赋值,“:”代表 阅读全文
posted @ 2011-09-19 21:37 Ghost_zhao 阅读(326) 评论(0) 推荐(0)
摘要: 第五章. 函数、函数与运算符的重载 C++程序允许两种函数说明语句的形式,分别称为函数原型(或函数声明)和函数定义。 属性说明:可缺省,一般可以是下面的关键字之一:inline、static、virtual、friend 等。 inline :表示该函数为内联函数。 static :表示该函数为静态函数。 virtual:表示该函数为虚函数。 friend :表示该函数为某类(class)的友元函数。 函数的调用重载与其他语言相同,但在C++中可以重载操作符而Java中不能。内联(inline)函数的设置是C++不同于C 的特征之一。虽然这些带参数的宏定义的功能与应的内联函数基本一致,但仍然是 阅读全文
posted @ 2011-08-09 22:48 Ghost_zhao 阅读(423) 评论(0) 推荐(0)
摘要: 出于个人兴趣原因用业余时间看一点C++,作此笔记作为备忘,此次只是粗略观察,将来认真学习是再仔细研究 。 随意在网上下了一本《[高级语言Cpp程序设计].刘璟.文字版.pdf》,就以这本书为基准开始吧。作为一个有 Java 和 C# 开发经验又了解一些 C 的人,我也将着重从这几种语言的之间的相同和不同下手尽快对C++有一个粗浅的了解,希望可以抛砖引玉得到高手指点。 闲言少叙,书归正传。 第一章. 绪论 某年某月某日由于某种原因产生了C++,由于N+1个原因我们要使用和学习C++,本书将如何如何讲解。。。。。。。。。。。。。。。。 第二章. C++语言初步 Hello C++! 在开头的 #. 阅读全文
posted @ 2011-08-06 11:44 Ghost_zhao 阅读(481) 评论(0) 推荐(0)
摘要: 一、Jquery 常用函数 1 $("#+id") 获得控件 例: var _jd_dialog = $("#jd_dialog"); 2 parentNode 上级 例: this.parentNode.parentNode.removeChild(this.parentNode); 3 removeChild 去掉子节点 例: this.parentNode.parentNode.removeChild(this.parentNode); 4 prepend 前置 例: $("body").prepend("<di 阅读全文
posted @ 2011-08-02 23:19 Ghost_zhao 阅读(431) 评论(0) 推荐(0)
摘要: 一、不经后台直接打开控件 1.<% Html.RenderPartial("TreeControl", Model.Groups);%> //在同一个Controller下2.<% Html.RenderPartial("~/Views/HR/SelfAbilityIndex.ascx", model%>//在另一个Controller下二、按钮(链接)1<%=Ajax.ActionLink("编辑", // 显示名"UpdateSelfAbility", // 后台Actionnew 阅读全文
posted @ 2011-08-02 23:17 Ghost_zhao 阅读(454) 评论(2) 推荐(0)
摘要: //_________________________________________________////Description : 发现自己的代码写的越来越玄幻了 //// CODER : Ghost //// Time : 2011-6-10 ////_________________________________________________//// 更新在最后 Add by Ghost也许我该这样写int Max(int a,int b){ int x; if(a>b) { x=a; } else { x=b; } return x;}其实我是这样写的int Max(in 阅读全文
posted @ 2011-08-02 23:04 Ghost_zhao 阅读(586) 评论(6) 推荐(0)
摘要: 本博客于2011年8月2日 开通,特此记录。 本博客主要方便技术交流,欢迎访问留言。 标题 :幽灵的命名空间 网址 :http://www.cnblogs.com/GhostZCH/开博人 :Ghost 联系方式 : QQ :1926806425 阅读全文
posted @ 2011-08-02 22:59 Ghost_zhao 阅读(195) 评论(1) 推荐(0)
点击右上角即可分享
微信分享提示