发明内容
针对现有技术中存在的缺陷,本发明的目的在于提供一种减少对象序列化占用存储空间的方法,通过使用Pickle对象进行对象序列化,从而减少序列化对象所占用的内存大小,进而提高文件的写入速度,并减少存储该文件所需的硬盘空间大小。
为达到以上目的,本发明采取的技术方案是:
一种减少对象序列化占用存储空间的方法,包括步骤:
定义一个Pickle对象,所述Pickle对象用于以字节流格式保存待序列化对象的内容;
将待序列化对象的内容写入到所述Pickle对象中;
根据所述Pickle对象的内存地址指针和占用内存的大小,创建本地硬盘文件,并将所述Pickle对象的内容写入到本地硬盘中。
在上述技术方案的基础上,所述待序列化对象包括若干字段,所述将待序列化对象的内容写入到所述Pickle对象中的具体步骤包括:
A1:定义一个偏移变量,所述偏移变量用于保存写入待序列化对象的内存偏移量,并对所述偏移变量进行初始化;
A2:调用strlen函数获取第一个字段的内存大小;
A3:调用WriteData函数写入第一个字段的内容,并将所述偏移变量的值增加所述第一个字段的内存大小;
A4:重复步骤A2~A3,写入下一个字段的内容,并将所述偏移变量的值增加所述下一个字段的内存大小,直至写入所述待序列化对象中的所有字段。
在上述技术方案的基础上,所述步骤A2和A3之间还包括步骤:
调用WriteInt函数在所述Pickle对象的内存头部写入获取到的第一个字段的内存大小,并将所述偏移变量的值增加所述第一个字段的内存大小所占用的内存。
在上述技术方案的基础上,在调用WriteData函数写入第一个字段的内容时,还包括步骤:调用Align函数对第一个字段的内容进行对齐。
在上述技术方案的基础上,根据所述Pickle对象的内存地址指针和占用内存的大小,创建本地硬盘文件,并将所述Pickle对象的内容写入到本地硬盘中的具体步骤包括:
预先定义一个Header对象,使用所述Header对象保存所述Pickle对象占用内存的大小;
调用data函数返回Pickle对象的内存地址指针,调用size函数返回Header对象中保存的所述Pickle对象占用内存的大小;
根据所述Pickle对象的内存地址指针和占用内存的大小,调用CreateFile函数创建一个本地硬盘文件,再调用WriteFile函数把所述Pickle对象的内容写入到本地硬盘当中。
在上述技术方案的基础上,在将待序列化对象的内容写入到所述Pickle对象中的同时,还包括步骤:调用realloc函数动态调整所述Pickle对象内存。
本发明还提供了一种存储介质,该存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现上述减少对象序列化占用存储空间的方法。
本发明还提供了一种电子设备,包括存储器和处理器,存储器上储存有在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述减少对象序列化占用存储空间的方法。
本发明还提供了一种减少对象序列化占用存储空间的系统,包括:
自定义模块,其用于定义一个Pickle对象,所述Pickle对象用于以字节流格式保存待序列化对象的内容;
写入模块,其用于将待序列化对象的内容写入到所述Pickle对象中;
存储模块,其用于根据所述Pickle对象的内存地址指针和占用内存的大小,创建本地硬盘文件,并将所述Pickle对象的内容写入到本地硬盘中。
在上述技术方案的基础上,所述待序列化对象包括若干字段,所述写入模块具体包括:
设置单元,其用于定义一个偏移变量,所述偏移变量用于保存写入待序列化对象的内存偏移量,并对所述偏移变量进行初始化;
获取单元,其用于调用strlen函数获取每个字段的内存大小;
处理单元,其用于调用WriteData函数写入每个字段的内容,并在写入一个字段的内容后将所述偏移变量的值增加该写入字段的内存大小。
在上述技术方案的基础上,所述存储模块具体包括:
预定义单元,其用于预先定义一个Header对象,使用所述Header对象保存所述Pickle对象占用内存的大小;
返回单元,其用于调用data函数返回Pickle对象的内存地址指针,调用size函数返回Header对象中保存的所述Pickle对象占用内存的大小;
存储单元,其用于根据所述Pickle对象的内存地址指针和占用内存的大小,调用CreateFile函数创建一个本地硬盘文件,再调用WriteFile函数把所述Pickle对象的内容写入到本地硬盘当中。
与现有技术相比,本发明的优点在于:
(1)本发明的减少对象序列化占用存储空间的方法,通过使用Pickle对象进行对象序列化,由于Pickle对象以字节流格式保存待序列化对象的内容,可以对待序列化对象的内容格式进行重新排列优化,该字节流格式的文件规则也不会导致文件的内容增大,从而减少序列化对象所占用的内存大小,并在硬盘空间中写入该序列化对象时,提高了文件的写入速度,减少存储该文件所需的硬盘空间大小,使得用户体验较好。
(2)本发明的减少对象序列化占用存储空间的方法中,调用realloc函数动态调整所述Pickle对象内存,使得在将待序列化对象的内容写入到所述Pickle对象中时,Pickle对象的内存自动增长,且始终与待序列化对象的内存保持一致,有效避免申请多余的内存,节约了内存资源。
(3)本发明的减少对象序列化占用存储空间的方法中,调用Align函数对第一个字段的内容进行对齐,可以使得待序列化对象的每个字段的内存对齐,优化内存排列。
具体实施方式
以下结合附图及实施例对本发明作进一步详细说明。
实施例一
参见图1所示,本发明实施例提供一种减少对象序列化占用存储空间的方法,包括步骤:
S1:定义一个Pickle对象,所述Pickle对象用于以字节流格式保存待序列化对象的内容;
S2:将待序列化对象的内容写入到所述Pickle对象中;
S3:根据所述Pickle对象的内存地址指针和占用内存的大小,创建本地硬盘文件,并将所述Pickle对象的内容写入到本地硬盘中。
本发明实施例中,该存储空间包括内存空间和本地硬盘空间。
本发明实施例的减少对象序列化占用存储空间的方法,通过使用Pickle对象进行对象序列化,由于Pickle对象以字节流格式保存待序列化对象的内容,可以对待序列化对象的内容格式进行重新排列优化,该字节流格式的文件规则也不会导致文件的内容增大,从而减少序列化对象所占用的内存大小,并在硬盘空间中写入该序列化对象时,提高了文件的写入速度,减少存储该文件所需的硬盘空间大小,使得用户体验较好。
在本发明实施例中,待序列化对象为Object对象,待序列化对象示例如下:
上述Object对象包括两个字段,分别为id字段和name字段,且id字段和name字段各分配有200字节,Object对象总内存为400字节。
在有些情况下,虽然Object对象的总内存较大,但是该总内存中有些字节并未存储有内容,该Object对象实际使用到的内存较小。在本发明实施例中,以,id字段和name字段只需分别使用到100字节的内存为例。
当采用现有技术的序列化方法对上述Object对象进行序列化时,Object对象总内存为400字节,但id和name字段只需分别使用到100字节的内存,Object对象实际上只用到了200字节的内存,但却占用了400字节的内存,从而造成内存资源的浪费,没有用到的内存数据也会被序列化到文件当中,导致序列化后的文件较大,当将该文件写入到硬盘时,不仅写入速度明显较慢,而且占用的硬盘空间较大,用户体验较差。
当使用本发明实施例中的减少对象序列化占用存储空间的方法时,先用Pickle对象以字节流格式保存Object对象的内容,再将Object对象的内容写入到所述Pickle对象中,根据所述Pickle对象的内存地址指针和占用内存的大小,创建本地硬盘文件,并将所述Pickle对象的内容写入到本地硬盘中。在此过程中,所述Pickle对象的内容即为Object对象的内容,具体为id字段和name字段的内容,Object对象总内存为400字节,而Pickle对象占用内存的大小等于id字段和name字段实际使用到的内存之和,即为200字节,将所述Pickle对象的内容写入到本地硬盘中,等同于将Object对象的内容写入到本地硬盘中去,但此时Pickle对象占用内存的大小只有200字节,与Object对象总内存400字节相比,不仅明显提高了写入速度,而且大大减少了占用的硬盘空间,使得用户体验较好。
进一步地,在将待序列化对象的内容写入到所述Pickle对象中的同时,还包括步骤:调用realloc函数动态调整所述Pickle对象内存。该步骤使得在将待序列化对象的内容写入到所述Pickle对象中时,Pickle对象的内存自动增长,且始终与待序列化对象的内存保持一致,有效避免申请多余的内存,节约了内存资源。
具体地,所述待序列化对象包括若干字段,在本发明实施例中,所述待序列化对象的若干字段为id字段和name字段。
参见图2所示,步骤S2中将待序列化对象的内容写入到所述Pickle对象中的具体步骤包括:
S201:定义一个偏移变量size_t,所述偏移变量size_t用于保存写入待序列化对象的内存偏移量,并对所述偏移变量size_t进行初始化,在本发明实施例中,初始化后的所述偏移变量size_t的值为0;
S202:调用strlen函数获取第一个字段的内存大小,此处第一个字段为id字段,获取到的第一个字段的内存大小为100字节;
S203:调用WriteInt函数在所述Pickle对象的内存头部写入获取到的第一个字段的内存大小,并将所述偏移变量size_t的值增加所述第一个字段的内存大小所占用的内存;
在本发明实施例中,即在所述Pickle对象的内存头部写入一个数字变量100,且由于该数字变量100为int类型,数字变量100占用所述Pickle对象的内存大小为4字节,所述偏移变量size_t的值增加4,此时偏移变量size_t的值为4;
S204:调用WriteData函数写入第一个字段的内容,并将所述偏移变量size_t的值增加所述第一个字段的内存大小;
在本发明实施例中,即调用WriteData函数写入id字段的内容,由于id字段的内存大小为100字节,因此,将所述偏移变量size_t的值增加100,此时所述偏移变量size_t的值变为104;
S205:重复步骤S202~S204,完成下一个字段的内容的写入,直至写入所述待序列化对象中的所有字段;
在本发明实施例中,该下一个字段即为name字段,当写入name字段的内容后,即写入所述Object对象中的所有字段,依此类推,最后所述偏移变量size_t的值将增加至208,可见,与Object对象总内存400字节相比,所述Pickle对象占用的内存208字节较小,该序列化过程使得占用内存呢大小比原来减少了接近50%,效果显著。
更进一步地,在本发明实施例中,在调用WriteData函数写入第一个字段的内容时,还包括步骤:调用Align函数对第一个字段的内容进行对齐,可以使得待序列化对象的每个字段的内存对齐,优化内存排列。
具体为:调用bits::Align函数,对id字段的内容进行4字节对齐,使得id字段的内容与下个name字段的内容对齐,优化内存排列。
参见图3所示,在本发明实施例中,步骤S3中根据所述Pickle对象的内存地址指针和占用内存的大小,创建本地硬盘文件,并将所述Pickle对象的内容写入到本地硬盘中的具体步骤包括:
S301:预先定义一个Header对象,使用所述Header对象保存所述Pickle对象占用内存的大小;
所述Pickle对象占用内存的大小即为Object对象实际上使用到的内存大小,为200字节;
S302:调用data函数返回Pickle对象的内存地址指针,调用size函数返回Header对象中保存的所述Pickle对象占用内存的大小;
S303:根据所述Pickle对象的内存地址指针和占用内存的大小,调用CreateFile函数创建一个本地硬盘文件,再调用WriteFile函数把所述Pickle对象的内容写入到本地硬盘中,即把Object对象的内容写入到本地硬盘中。
此时,所述Pickle对象占用内存的大小比Object对象的总内存要减少很多,在将所述Pickle对象的内容写入到本地硬盘中时,写入速度明显提高,且占用的本地硬盘空间也较小,不仅节约存储资源,而且提高用户体验。
基于同一发明构思,本申请提供了实施例一对应的存储介质的实施例,详见实施例二
实施例二
对应上述减少对象序列化占用存储空间的方法,本发明实施例还提供了一种存储介质的实施例,该存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现上述实施例所述的减少对象序列化占用存储空间的方法的步骤,具体实现以下步骤:
定义一个Pickle对象,所述Pickle对象用于以字节流格式保存待序列化对象的内容;
将待序列化对象的内容写入到所述Pickle对象中;
根据所述Pickle对象的内存地址指针和占用内存的大小,创建本地硬盘文件,并将所述Pickle对象的内容写入到本地硬盘中。
需要说明的是,本发明实施例中使用的方法和实施例一中一种减少对象序列化占用存储空间的方法是基于同一构思的,故而基于本申请实施例一种介绍的方法,本领域的技术人员能够了解本实施例的存储介质的具体实施方式以及其各种变化形式,所以在此对于该存储介质如何实现本申请实施例中的方法以及各种优选方案不再详细介绍。
基于同一发明构思,本申请提供了实施例一对应的电子设备的实施例,详见实施例三
实施例三
参见图4所示,对应上述减少对象序列化占用存储空间的方法,本发明实施例还提供了一种电子设备的实施例,该电子设备存储有计算机程序,计算机程序被处理器执行时实现上述各实施例所述的减少对象序列化占用存储空间的方法的步骤。
该电子设备包括存储器和处理器,存储器上储存有在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
定义一个Pickle对象,所述Pickle对象用于以字节流格式保存待序列化对象的内容;
将待序列化对象的内容写入到所述Pickle对象中;
根据所述Pickle对象的内存地址指针和占用内存的大小,创建本地硬盘文件,并将所述Pickle对象的内容写入到本地硬盘中。
需要说明的是,本发明实施例中使用的方法和实施例一中一种减少对象序列化占用存储空间的方法是基于同一构思的,故而基于本申请实施例一种介绍的方法,本领域的技术人员能够了解本实施例的电子设备的具体实施方式以及其各种变化形式,所以在此对于该电子设备如何实现本申请实施例中的方法以及各种优选方案不再详细介绍。
基于同一发明构思,本申请提供了实施例一对应的一种同步本地与服务器时间的系统,详见实施例四。
实施例四
本发明实施例还提供了一种减少对象序列化占用存储空间的系统,包括:
自定义模块,其用于定义一个Pickle对象,所述Pickle对象用于以字节流格式保存待序列化对象的内容;
写入模块,其用于将待序列化对象的内容写入到所述Pickle对象中;
存储模块,其用于根据所述Pickle对象的内存地址指针和占用内存的大小,创建本地硬盘文件,并将所述Pickle对象的内容写入到本地硬盘中。
更进一步地,所述待序列化对象包括若干字段,所述写入模块具体包括:
设置单元,其用于定义一个偏移变量,所述偏移变量用于保存写入待序列化对象的内存偏移量,并对所述偏移变量进行初始化;
获取单元,其用于调用strlen函数获取每个字段的内存大小;
处理单元,其用于调用WriteData函数写入每个字段的内容,并在写入一个字段的内容后将所述偏移变量的值增加该写入字段的内存大小。
在本发明实施例中,所述存储模块具体包括:
预定义单元,其用于预先定义一个Header对象,使用所述Header对象保存所述Pickle对象占用内存的大小;
返回单元,其用于调用data函数返回Pickle对象的内存地址指针,调用size函数返回Header对象中保存的所述Pickle对象占用内存的大小;
存储单元,其用于根据所述Pickle对象的内存地址指针和占用内存的大小,调用CreateFile函数创建一个本地硬盘文件,再调用WriteFile函数把所述Pickle对象的内容写入到本地硬盘当中。
本发明实施例的减少对象序列化占用存储空间的系统,通过使用Pickle对象进行对象序列化,由于Pickle对象以字节流格式保存待序列化对象的内容,可以对待序列化对象的内容格式进行重新排列优化,该字节流格式的文件规则也不会导致文件的内容增大,从而减少序列化对象所占用的内存大小,并在硬盘空间中写入该序列化对象时,提高了文件的写入速度,减少存储该文件所需的硬盘空间大小,使得用户体验较好。
本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。