拷贝

ArcGIS Server切片迁移方案

天大地大妈咪最大 提交于 2019-12-16 18:36:19
目录 1. 背景 2. 导出切片 3. 发布空服务 3.1 注册文件夹至ArcGIS Server 3.2 发布服务 4. 导入切片 5. 在现有切片的基础上继续切图 1. 背景 因地图切图需要占用大量性能资源,所以发布大范围切片地图服务的通常做法是在单独的切图服务器上切图,将成果拷贝到线上服务器上发布。 本文整理了切片迁移的方法,以帮助快速地迁移切片成果。 2. 导出切片 首先,在切图服务器的ArcGIS Server Manager中停止切片服务,否则文件会有文件锁而不能复制。 打开…\arcgisserver\directories\arcgiscache\服务名称文件夹,将其中的图层(Layer)文件夹整个复制,然后拷贝到目标服务器上。 Tips:细碎文件复制比较慢,可以将整个文件夹打包成一个压缩包,压缩方式选择存储,压缩速度较快,拷贝速度也较快。 3. 发布空服务 最好是使用创建切片的数据和mxd发布,保证迁移后的切片服务中的各个图层结构和其他元数据可读。如不能使用上述数据和mxd,请务必确保新创建的mxd数据框坐标系与原mxd完全一致。 3.1 注册文件夹至ArcGIS Server 对于较大的数据,一般采取将数据文件夹注册到ArcGIS Server上。 ①赋予ArcGIS Server账户该文件夹的读写权限。 如不进行此操作ArcGIS Server会提示如下错误。

Dockerfile 中的 COPY 与 ADD 命令

老子叫甜甜 提交于 2019-12-16 14:03:48
Dockerfile 中提供了两个非常相似的命令 COPY 和 ADD,本文尝试解释这两个命令的基本功能,以及其异同点,然后总结其各自适合的应用场景。 Build 上下文的概念 在使用 docker build 命令通过 Dockerfile 创建镜像时,会产生一个 build 上下文(context)。所谓的 build 上下文就是 docker build 命令的 PATH 或 URL 指定的路径中的文件的集合。在镜像 build 过程中可以引用上下文中的任何文件,比如我们要介绍的 COPY 和 ADD 命令,就可以引用上下文中的文件。 默认情况下 docker build -t testx . 命令中的 . 表示 build 上下文为当前目录。当然我们可以指定一个目录作为上下文,比如下面的命令: $ docker build -t testx /home/nick/hc 我们指定 /home/nick/hc 目录为 build 上下文,默认情况下 docker 会使用在上下文的根目录下找到的 Dockerfile 文件。 COPY 和 ADD 命令不能拷贝上下文之外的本地文件 对于 COPY 和 ADD 命令来说,如果要把本地的文件拷贝到镜像中,那么本地的文件必须是在上下文目录中的文件。其实这一点很好解释,因为在执行 build 命令时, docker

python 浅拷贝和深拷贝(9)

浪尽此生 提交于 2019-12-16 13:55:46
何谓浅拷贝/深拷贝,说得直白一点,其实就是数据拷贝,两者到底有什么区别呢?听着就挺迷糊的,python开发项目的时候说不定你就能碰上这样的坑~~ 一.普通的变量赋值 我们平常使用的变量赋值就是浅拷贝,即两个变量共享同一个内存块,相同的内存地址,一旦值发生改变,另外一个变量的值也会跟随着一起变化,演示代码如下: list1 = [1,2,3,4,5] # 普遍的变量赋值 list2 = list1 print(id(list1)) print(id(list2)) # 修改列表list2的数据 list2.append(123) print(list1) print(list2) 输出结果: 2251297055368 2251297055368 [1, 2, 3, 4, 5, 123] [1, 2, 3, 4, 5, 123] 注意:常规的变量赋值共享一个内存块,内存地址相同,一旦值发生改变,共享同一个内存地址的所有变量值都会发生改变,可以直接通过内置函数id()对比下内存地址即可! 二.浅拷贝和深拷贝 在python开发过程中,有些时候对于上面的情况并不是我们想要的,我们更加希望对赋值后的变量做修改并不影响原始变量的值,如何实现呢?这里就需要介绍一下copy模块: copy.copy() – 浅拷贝,重新分配内存,只拷贝父对象,不会拷贝对象的内部的子对象; copy

Linux零拷贝之sendfile/splice

随声附和 提交于 2019-12-16 02:06:56
  sendfile/splice实现了真正意义上的零拷贝:CPU完全不需要参与数据的拷贝,应用层Java NIO为开发人员提供了FileChannel.transferFrom()/transferTo()方法使用零拷贝。 sendfile 传输原理 用户进程通过 sendfile() 函数向内核(kernel)发起系统调用,上下文从用户态(user space)切换为内核态(kernel space); CPU 利用 DMA 控制器将数据从主存或硬盘拷贝到内核空间(kernel space)的读缓冲区(read buffer); CPU 把读缓冲区(read buffer)的文件描述符(file descriptor)和数据长度拷贝到网络缓冲区(socket buffer); 基于已拷贝的文件描述符(file descriptor)和数据长度,CPU 利用 DMA 控制器的 gather/scatter 操作直接批量地将数据从内核的读缓冲区(read buffer)拷贝到网卡进行数据传输; 上下文从内核态(kernel space)切换回用户态(user space),Sendfile 系统调用执行返回; 适用场景   sendfile适用于文件数据到网卡的传输过程,并且用户程序对数据没有修改的场景; splice 传输原理 用户进程通过 splice() 函数向内核

js内置对象-Object

徘徊边缘 提交于 2019-12-15 22:00:45
Javascript-Object 好好学习,天天向下! js中的一些内置方法还是挺好用的,使用它们有时候会节省我们很多时间,还有减少代码量 一、Object.keys(obj) 获取一个对象的key值,但是参数obj必须是 可枚举的 对象,他会返回一个包含对象自身的所有可枚举属性值的 数组 。 let obj = { a : 1 , b : 2 , c : 3 , d : 4 , e : { a : 1 , b : 2 } , abc : 123 } ; let keys = Object . keys ( obj ) ; console . log ( keys ) ; //["a", "b", "c", "d", "e", "abc"] 二、Object.values(obj) 获取一个对象value值,同样参数obj也必须是 可枚举的 对象,他会返回一个包含对象自身的所有可枚举属性值的 数组 。 let values = Object . values ( obj ) ; console . log ( values ) ; //[1, 2, 3, 4, {…}, 123] 注意: 上面两个方法所返回的数组和你去 for...in 的值的顺序是一样的,所以可以放心使用 三、Object.assign(target, …sources) 对对象进行深拷贝( 仅适用于第一层 )

Kafka高吞吐低延迟原理

三世轮回 提交于 2019-12-15 17:54:30
Kafka基于磁盘做的数据存储,如何实现高性能、高吞吐、低延时? Reference: http://searene.me/2017/07/09/Why-is-Kafka-so-fast/ and https://queue.acm.org/detail.cfm?id=1563874 . 顺序读写   Kafka将消息记录持久化到本地磁盘中,实际上不管是内存还是磁盘,快或慢关键在于寻址的方式,磁盘分为顺序读写与随机读写,内存也一样分为顺序读写与随机读写。基于磁盘的随机读写确实很慢,但磁盘的顺序读写性能却很高。   Kafka使用磁盘顺序读写来提升性能,Kafka的message是不断追加到本地磁盘文件末尾的,而不是随机的写入,这使得Kafka写入吞吐量得到了显著提升 。每一个Partition其实都是一个文件 ,收到消息后Kafka会把数据插入到文件末尾。   这种方法不能删除数据 ,所以Kafka是不会删除数据的,它会把所有的数据都保留下来,每个消费者(Consumer)对每个Topic都有一个offset用来表示 读取到了第几条数据 。 两个消费者,Consumer1有两个offset分别对应Partition0、Partition1(假设每一个Topic一个Partition);Consumer2有一个offset对应Partition2

Python学习之赋值、浅拷贝和深拷贝

梦想的初衷 提交于 2019-12-15 09:14:34
拷贝大家都比较熟悉,就是复制,其实又和传统的复制有一定的区别 一、赋值 赋值就是把一个对象的引用(在内存中的存储地址即存储对象的内存地址)和变量进行关联起来。对象的地址可通过函数id查询及id(obj),如a=b,其实就是把a的内存地址和变量b关联起来。 a=['a',3,'c','b',[2,'b']] b=a #a的内存地址与变量b关联 print(a,b) print(id(a),id(b)) """a和b的地址是一样的,所以a和b两个变量中任何一个发生改变另外一个也会跟着改变因为他们俩的地址是一样的""" a[1]='d' print(a,b) b[4][0]='a' print(a,b) a.append('e') print(a,b) print(id(a),id(b)) """小结:1、一旦对象生成后那么它的存储地址就会固定了,所以再怎么改变变量的值,它的存储地址不会改变 2、经过赋值后两个变量的地址一样,类似于指针,所以改变其中任何一个另外一个会跟着改变""" 执行结果: ['a', 3, 'c', 'b', [2, 'b']] ['a', 3, 'c', 'b', [2, 'b']] 1575497342144 1575497342144 ['a', 'd', 'c', 'b', [2, 'b']] ['a', 'd', 'c', 'b', [2, 'b']] [

memmove() -- 拷贝内存内容

和自甴很熟 提交于 2019-12-14 23:53:48
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> memmove() -- 拷贝内存内容 2007年07月06日 星期五 11:41 相关函数: bcopy(), memccpy() , memcpy() , strcpy(), strncpy() 表头文件: #include <string.h> 定义函数: void *memmove(void *dest, const void *src, size_t n); 函数说明: memmove()与memcpy()一样都是用来拷贝src所指的内存内容前n个字节到dest所指的地址上。不同的是,当src和dest所指的内存区域重叠时,memmove()仍然可以正确的处理,不过执行效率上会比使用memcpy()略慢些。 返回值: 返回指向dest的指针。 附加说明: 指针src和dest所指的内存区域可以重叠。 memcpy()、 memmove()和memccpy() ------------------------------------------------------- 这三个函数的功能均是将某个内存块复制到另一个内存块。前两个函数的区别在于它们处理内存区域重叠(overlapping)的方式不同。第三三个函数的功能也是复制内存,但是如果遇到某个特定值时立即停止复制。 对于库函数来说

c memmove和memcpy的实现和区别

微笑、不失礼 提交于 2019-12-14 23:38:55
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下: void *memcpy(void *dst, const void *src, size_t count); void *memmove(void *dst, const void *src, size_t count); 他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。 第一种情况下,拷贝重叠的区域不会出现问题,内容均可以正确的被拷贝。 第二种情况下,问题出现在右边的两个字节,这两个字节的原来的内容首先就被覆盖了,而且没有保存。所以接下来拷贝的时候,拷贝的是已经被覆盖的内容,显然这是有问题的。 实际上,memcpy只是memmove的一个子集。 二者的c语言实现很简单,有兴趣的朋友可以去看看。在实际情况下,这两个函数都是用汇编实现的。 memmove在copy两个有重叠区域的内存时可以保证copy的正确,而memcopy就不行了,但memcopy比memmove的速度要快一些,如: char s[] = "1234567890"; char* p1 = s; char* p2 = s+2;

前端面试之深浅拷贝

六眼飞鱼酱① 提交于 2019-12-14 07:10:35
深浅拷贝 涉及面试题:什么是浅拷贝?如何实现浅拷贝?什么是深拷贝?如何实现深拷贝? 在上一章节中,我们了解了对象类型在赋值的过程中其实是复制了地址,从而会导致改变了一方其他也都被改变的情况。通常在开发中我们不希望出现这样的问题,我们可以使用浅拷贝来解决这个情况。 浅拷贝 首先可以通过 Object.assign 来解决这个问题,很多人认为这个函数是用来深拷贝的。其实并不是,Object.assign 只会拷贝所有的属性值到新的对象中,如果属性值是对象的话,拷贝的是地址,所以并不是深拷贝。 注意,Object.assign 不会跳过那些值为 null 或 undefined 的源对象 let a = { age : 1 } let b = Object . assign ({}, a ) a . age = 2 console . log ( b . age ) // 1 另外我们还可以通过展开运算符 ... 来实现浅拷贝 let a = { age : 1 } let b = { ... a } a . age = 2 console . log ( b . age ) // 1 通常浅拷贝就能解决大部分问题了,但是当我们遇到如下情况就可能需要使用到深拷贝了 let a = { age : 1 , jobs : { first : 'FE' } } let b = { ... a