-
2019-12-19 16:20:47更多相关内容
-
C# 内存复制和数组复制示例
2018-03-22 16:55:54内存复制-Marshal.Copy: // 复制当前传入的数据 byte[] pcm_src = new byte[len]; // 复制数据到二进制数组 Marshal.Copy(pcm, pcm_src, 0, len);数组复制-Array.Copy:// 复制当前传入的数据 byte[] pcm_src = ...内存复制-Marshal.Copy:
// 复制当前传入的数据 byte[] pcm_src = new byte[len]; // 复制数据到二进制数组 Marshal.Copy(pcm, pcm_src, 0, len);
数组复制-Array.Copy:
// 复制当前传入的数据 byte[] pcm_src = new byte[len]; // 复制数据到二进制数组 Marshal.Copy(pcm, pcm_src, 0, len); // 复制新传入的数据到新的数组结构 Array.Copy(pcm_src, 0, pcm_dest, bts_left.Length, len)
测试示例:
// 采样数 ushort samples = 320; // 上次剩余的字节 byte[] bts_left; class aa { public byte[] pcm; public int len; } private List<aa> data = new List<aa>(); public void PlayAudio(IntPtr pcm, int len) { lock (this) { int samples_len = samples * 2; if (len == samples_len) { byte[] bts = new byte[len]; Marshal.Copy(pcm, bts, 0, len); data.Add(new aa { len = len, pcm = bts }); } else // 此处解决采样数为1024时分割可以复制数据的大小 { var len_temp = bts_left ==null? len : len + bts_left.Length; byte[] pcm_dest = new byte[len_temp]; byte[] bts = new byte[samples_len]; // 复制数据 if (bts_left != null) { // 复制长度不够的数据 Array.Copy(bts_left,0, pcm_dest, 0, bts_left.Length); // 复制当前传入的数据 byte[] pcm_src = new byte[len]; // 复制数据到二进制数组 Marshal.Copy(pcm, pcm_src, 0, len); // 复制新传入的数据到新的数组结构 Array.Copy(pcm_src, 0, pcm_dest, bts_left.Length, len); bts_left = null; } else { Marshal.Copy(pcm, pcm_dest, 0, len_temp); } // 获取播放数据 int index = 0,count= len_temp / samples_len; int startIndex=0; Console.WriteLine(">>>total:"+ len_temp + ",times:" + count + ",left:" + len_temp % samples_len); while (index< count) { // 复制满足长度的数据 Array.Copy(pcm_dest, startIndex, bts, 0, samples_len); // 添加数据 data.Add(new aa { len = samples_len, pcm = bts }); index++; // 计算下一次的开始位置 startIndex = index * samples_len; } // 暂存长度不够的数据 var left_len = len_temp % samples_len; if (left_len > 0) { bts_left = new byte[left_len]; // 复制不够长度的数据 Array.Copy(pcm_dest, startIndex, bts_left, 0, left_len); } } } //SDL.SDL_Delay(10); }
-
【python】多进程中的内存复制
2018-01-02 21:34:28比较好奇python对于多进程中copy on ...所以如果主进程耗的资源较多时,不小心就会造成不必要的大量的内存复制,从而可能导致内存爆满的情况。 示例 举个例子,假设主进程读取了一个大文件对象的所有行,然后通比较好奇python对于多进程中copy on write机制的实际使用情况。目前从实验结果来看,python 使用multiprocessing来创建多进程时,无论数据是否不会被更改,子进程都会复制父进程的状态(内存空间数据等)。所以如果主进程耗的资源较多时,不小心就会造成不必要的大量的内存复制,从而可能导致内存爆满的情况。
示例
举个例子,假设主进程读取了一个大文件对象的所有行,然后通过multiprocessing创建工作进程,并循环地将每一行数据交给工作进程来处理:
def parse_lines(args): #working ... def main_logic(): f = open(filename , 'r') lines = f.readlines() f.close() pool = multiprocessing.Pool(processes==4) rel = pool.map(parse_lines , itertools.izip(lines , itertools.repeat(second_args)) , int(len(lines)/4)) pool.close() pool.join()
以下是top及ps结果:
(四个子进程)
(父进程及四个子进程)
由上两张图可以看出父进程及子进程都各自占用了1.4G左右的内存空间。而大部分内存空间存储的是读数据lines,所以这样的内存开销太浪费。
优化计划
1: 在主进程初期未导入大量的py库之前创建进程,或者动态加载py库。
2:通过内存共享来减少内存的开销。
3: 主进程不再读取文件对象,交给每个工作进程去读取文件中的相应部分。
改进代码:
def line_count(file_name): count = -1 #让空文件的行号显示0 for count,line in enumerate(open(file_name)): pass #enumerate格式化成了元组,count就是行号,因为从0开始要+1 return count+1 def parse_lines(args): f = open(args[0] , 'r') lines = f.readlines()[args[1]:args[2]] #read some lines f.close() #working def main_logic(filename,process_num): line_count = line_count(filename) avg_len = int(line_count/process_num) left_cnt = line_count%process_num; pool = multiprocessing.Pool(processes=process_num) for i in xrange(0,process_num): ext_cnt = (i>=process_num-1 and [left_cnt] or [0])[0] st_line = i*avg_len pool.apply_async(parse_lines, ((filename, st_line, st_line+avg_len+ext_cnt),)) #指定进程读某几行数据 pool.close() pool.join()
再次用top或者ps来查看进程的内存使用情况:
(四个子进程)
(父进程及四个子进程)小结
对比两次的内存使用情况,改进代码后父进程及子进程所占用的内存明显减少;所有内存占用相当于原来的一半,这就是减少内存复制的效果。
关于内存使用这方面还有不少优化方法和空间,稍后继续研究。
-
c/c++知识点---内存复制函数memcpy的使用
2017-10-06 17:44:33memcpy实现的功能:从一个指针所指向的地址作为开始,复制一定大小的内容,给另一个指针所指向的地址。 代码: #include #include using namespace std; int main() { int *p = new int[5]; for (int i = 0; i...
memcpy 也就是memory和copy的简写。
memcpy实现的功能:从一个指针所指向的地址作为开始,复制一定大小的内容,给另一个指针所指向的地址。
代码:
#include <iostream> #include <cstring> using namespace std; int main() { int *p = new int[5]; for (int i = 0; i < 5; i++) { p[i] = i; } int *p2 = new int[5]; memcpy(p2, p,5*sizeof(int));//从p指向的内存复制 5*sizeof(int)大小的内容 给p2所指向的内存 for(int i = 0;i<5;i++) { cout << p2[i] << endl; } system("pause"); return 0; } /* void* __cdecl memcpy( _Out_writes_bytes_all_(_Size) void* _Dst, //destination目的地 _In_reads_bytes_(_Size) void const* _Src, //source 源头 _In_ size_t _Size //空间大小 ) */
运行结果:
-
strcpy(字符串复制)和memcpy(内存复制)
2016-01-19 11:07:23strcpy用于字符串的复制,memcpy用于内存复制,没有类型限制。版权声明:本文来自博客园_Echo Jin的文章,网址:http://www.cnblogs.com/stoneJin/archive/2011/09/16/2179248.html 在此对原作者表示感谢。 ... -
请教内存复制效率问题
2015-08-11 12:31:26使用memcpy函数拷贝64M内存,通过QueryPerformanceCounter函数计算了下时间,结果显示耗时50ms左右,但是通过Everest (现在叫AIDA64)性能测试看到的内存复制能达到11000M字节以上,机器为服务器配置,128G内存,... -
关于数组溢出------warning C4789: 内存复制的目标太小
2015-07-21 13:52:16 Holy Shit!!...不小心犯了个低级错误——在使用数组时,下标使用时出错了(我一直想当然的没错,先入为主的观念),结果编译器就不干了,耗费了一点时间找出问题,但需要引以为戒!...内存复制的目标太小 -
Go 语言的切片与内存复制 memcpy 的实现方法
2018-05-27 20:08:39最初我以为切片就是动态数组,实际程序设计过程中发现,切片是提供数组一个内存片段的一个合法的手段,利用切片功能,实际上我们可以自由访问数组的任何一个片段,因而可以借助 copy 函数,实现内存复制。... -
内存复制函数memcpy与内存替换函数memset
2018-02-06 09:37:40一.memcpy函数声明: void *memcpy( void* dest, const void* src, size_t count ); ...作用是从src指向的内存地址开始,复制count...memcpy由于是复制内存,故可用于复制任何数据,包括int、char、结构体、类、图 -
面试:实现内存复制函数
2012-10-19 15:39:56内存复制不应该修改原始内存吧。 因此,函数声明修改如下 0.3 void memcpy(void *dst, const void *src, size_t count) 这样就万事大吉了吗? 如果传入了空指针呢? 接着修改吧 0.4 void memcpy... -
memcpy内存复制代码的安全版本
2016-10-15 23:19:57C代码关于memcpy复制内存函数的安全版本#include #include #include <string.h>void *Memcpy(void *dst, const void *src, size_t size);int main(int argc, char *argv[]) { char buf[100] = "vincentabcd -
自定义内存复制函数memcpy()
2015-12-14 11:46:26memcpy是C语言中的内存复制函数,它的目的是将src指向地址为起始地址的连续n个字节的数据复制到以dest所指向地址为其实地址的空间内,函数返回指向destin的指针。需要注意的是src与dest所指内存区域不能重叠。与... -
C++ 对象复制 内存拷贝
2016-03-30 10:30:44memcpy将内存复制的时候可能是浅拷贝 定义的结构体 struct{ int a; char * b; queue way; } 利用memcpy拷贝的时候 queue不能拷贝 -
gdb 内存复制到/从文件
2014-11-07 14:23:13dump [格式] memory 文件名 起始地址 结构地址 # 把指定内存段写到文件 dump [格式] value 文件名 表达式 # 把指定值写到文件 格式包括: binary 原始二进制格式 ihex intel 16进制格式 -
【Java文件操作(六)】借助内存复制图片:ByteArrayOutputStream\ByteArrayInputStream\FileOutputStream\...
2019-07-19 16:01:13我的博客——Java文件操作系列 【Java文件操作(一)】递归打印文件目录 【Java文件操作(二)】删除文件夹,但保留其内部文件 ...【Java文件操作(六)】借助内存复制图片:ByteArrayOutputStream\By... -
C++实现内存复制函数(memmove解决内存重叠)
2016-04-16 22:23:31但复制后src内容会被更改。 当dest指向count区域时,目标区域和源区域有重叠,从目标区域复制3到dest时会覆盖源区域的5,复制以后结果 因此发生存在区域重叠时采用逆向复制 void* my_memmov -
delphi 的内存复制处理
2007-04-25 16:59:00type TRecord=record a:DWord; b:array [0..99] of Char; end;procedure TForm1.btn1Click(Sender: TObject);var buff:array [0..SizeOf(TRecord)-1] of Byte; a :^TRecord;begin a:=AllocMem(SizeOf(TRe -
python 深浅复制与指针内存
2015-03-19 15:15:07Python是一门很好的语言,他的优点在于拥有巨大灵活性的...今天思考了Python中关于指针和深浅复制的问题,下面希望能通过根据内存空间的变化对这些让人头疼的问题作出一个解释。 首先看第一个例子: a = 1 b = a -
汇编语言 段前缀的使用 复制内存单元数据到指定位置
2019-03-19 09:24:12将内存ffff:0~ffff:b单元中的数据复制到0:200~0:20b单元中 分析 0:200~0:20b可以转化为0200:0~0200:b 执行结果 代码 ;将内存ffff:0~ffff:b单元中的数据复制到0:200~0:20b单元中 ;分析 0:200~0:20b可以转化为0200:0... -
实现一个高效率的内存拷贝函数memcpy
2020-09-05 21:49:44memcpy是memory copy的缩写,意为内存复制,在写C语言程序的时候,我们常常会用到它。它的函原型如下: void *memcpy(void *dest, const void *src, size_t n); 它的功能是从src的开始位置拷贝n个字节的数据到dest... -
Java对象的复制三种方式
2021-02-12 09:36:34Java对象的复制三种方式概述在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能 会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也... -
Unity 使用Marshal类将托管内存封送到非托管内存
2021-11-09 11:50:47那我们如何在Unity中调用由C++封装的dll动态库中接口时将托管内存封装到非托管内存? Marshal类为此提供了方法集合,例如StringToHGlobalAnsi方法将ANSI字符从托管堆中的指定字符串复制到非托管堆中的缓冲区。 ... -
GC复制存活对象,它内存地址变了么?
2021-04-07 06:19:33前些天与一位朋友技术交流,朋友在招人面试时想到一个问题,JVM垃圾回收时,会复制存活的对象到不同的区域。比如从新生代复制到老年代,在此过程中,被复制的对象的地址是否变了呢?对他提出的这个问题很感兴趣,... -
内存拷贝CopyMemory与MoveMemory
2020-01-02 13:58:33CopyMemory是一个Windows API函数,它能将一块内存数据从一个位置复制到另一个位置; 函数原型: void CopyMemory( PVOID Destination, //要复制内存块的目的地址。 const VOID *Source, //要复制内存块的源地址... -
android 将assets 下的文件复制到手机内存中
2012-07-23 15:23:44在工程目录assets下的文件,将目录下的文件复制到手机内存或者SD卡内存中。 -
拷贝内存数据 QT---两种方法
2019-03-08 14:42:57拷贝内存数据(高字节在前,低字节在后) #include <QCoreApplication> #include <QDebug> class MemCopy { public: template <typename T> static T MemToData... -
频率和时序,哪个对内存性能影响更大
2020-03-09 14:58:33频率和时序是影响内存性能最重要的两个参数,但围绕两者的争辩一直持续不断,那就是两者之中,哪个对内存性能的影响会更大一些? 俗话说,实践出真知。为了探究这个问题,我们决定自己动手验证一番。 明确主题...