MATLAB中选择合适的数据类型以节约内存

在做大矩阵的运算,发现占用太多内存,于是在好友jcyao的提醒下,将double类型改为uint8类型内存是原来的1/8.(我的问题可以使用整形,其他问题不一定使用)。在网上搜到一篇如何选择变量类型的文章,写的很清楚,先摘下来。其网站matlabtips.com 上面有很多好的建议和优化方法。

Choose your variables wisely…

Posted on March
21, 2012
 by Jerome

I
am stuck home with a big fever so I hope this post is going to make sense. We’ll see! I named it against a miracle remedy that I would love to have under my hand.

One of the fundamental choices any programmer has to make is to decide on a particular data type for each one of his variable. In
the past
, Matlab used to work only with double data type. But now, it has been extended to a variety of class that it is important you know. Still, contrary to C, Matlab has a default datatype (Double), so you can get along for a long time without bothering
about this. But, in fact, double is a very very conservative choice that you rarely need.  Memory usage of variables is often overlooked.

There are 11 numerical data type : Double, Single, Int8, Int16, Int32, Int64,Uint8, Uint16, Uint32, Uint64,
Logical. These data types are different in the way they store information and their intrinsic resolution. Please take a look at the following table :

Class Max value Min Value Bytes Smallest difference
logical 1 0 1 (yes, Matlab wastes 7 bits here) 1
int8 127 -128 1 1
int16 32767 -32768 2 1
int32 2.14e+09 -2.14e+09 4 1
int64 9.22e+18 -9.22e+18 8 1
uint8 255 0 1 1
uint16 65535 0 2 1
uint32 4.29e+09 0 4 1
uint64 1.84e+19 0 8 1
single 3.40e+038 -3.40e+038 4 1.1755e-38
double 1.79e+308 -1.79e+308 8 2.2251e-308

Single and double are not stored the same way as integer. They are “floating-point”. This means that instead of using the full 64 bits to store the actual value of the number, some of these bits are dedicated to store the position of the “point”. This enable
Matlab to allow a much larger range of numbers than expected with a pure 64 bits coding (as can be seen when you compare double and int64).

Indeed, as you can see, they have very very different range. Double has a huge range of values available to it (10^308!). If you need to store real data (as oppose to integer) than single is most likely good enough for you. You’ll save half of your memory usage!

S0me c0mplicated mathematical operations do need double to avoid numerical inaccuracy but 99% of the time you are good to go. Besides Matlab will tell you before hand. Most Matlab functions can take both single and double.

Integers are good if you only need to apply simple arithmetic to your data. You can still divide 2 integers but the result is rounded to the closest integer. In image processing, for instance, nearly all the function can take any data type.

Why is all this important? let’s consider two examples :

  • If you record at 100 kHz (this is a standard data rate for many acquisition cards), for 100 seconds, you ends up with 10^7 data points. In double precision that means  80 Megabytes. This is quite heavy on memory but more importantly, on hard drive if you want
    to save your trace.
  • If you are playing with movies, it becomes even more critical to use the smallest data type as possible. For example, any camera can record around 500 by 500 pixels. If you image at 20 Hz (just faster than persistence of vision), than 100 seconds of movie is
    500 x 500 x 20 Hz x 100 seconds x 8 = 4 Gigabytes in memory in double precision! Most of the time, camera give you a 16 or even 8 bit integer, so you can save a factor of 4 in memory and on your hard drive (I am not talking about compressing the data yet,
    this is raw).

另外还有很多MatlAB的优化方法,很有意思:

时间: 2024-10-08 01:00:08

MATLAB中选择合适的数据类型以节约内存的相关文章

小蚂蚁学习mysql性能优化(7)--数据库结构优化--选择合适的数据类型

关于SQL以及索引优化的部分终于学习完了,今天开始进入第二层次的学习,数据库的结构优化,第一部分,选择合适的数据类型. 数据类型的选择,重点在于合适二字. 1.    使用可以存下数据的最小的数据类型 比如,一个时间类型的一个数据,可以使用varchar,可以使用datetime,还可以使用int,如何选择,就看哪一种类型对我们来说是最小的,不言而喻,int类型相对来说是最小的数据类型. 2.    使用简单的数据类型. int类型要比varchar类型在mysql处理上简单的多,用int类型来

8.1 第八章 选择合适的数据类型

在使用MySQL 创建数据表时都会遇到一个问题,如何为字段选择合适的数据类型.例 如,创建一张员工表用来记录员工的信息,这时对员工的各种属性如何来进行定义?也许大 家会想,这个问题很简单,每个字段可以使用很多种数据类型来定义,比如int.float.double. decimal 等.其实正因为可选择的数据类型太多,才需要依据一些原则来"挑选"最适合的 数据类型.本章将详细介绍字符.数值.日期数据类型的一些选择原则. 8.1 CHAR 与VARCHAR CHAR 和VARCHAR 类型

如何在程序开发项目中选择合适的 JavaScript 框架,节省时间和成本的9款极佳的JavaScript框架介绍

从技术上来看,iOS,Android 和 Windows Phone 上的移动应用是使用不同的程序语言开发的,iOS 应用使用 Objective-C,Android 应用使用 Java,而 Windows Phone 应用使用 .NET. .随着 JavaScript,CSS 和 HTML 知识技能的提升,相信你也可以构建一个超赞的移动应用.在这篇博客里,我们将会介绍一些极好的 JavaScript 移动应用程序开发框架. 说到网络开发,就不得不说 JavaScript,这是一款很有前途的程序

Design6:选择合适的数据类型

数据库使用Table来存储海量的数据,细分Table结构,数据最终存储在Table Column中,因此,在设计Table Schema时,必须慎重选择Table Column的Data Type,数据类型不仅决定了Column能够存储的数据范围和能够进行的操作,而且合适的数据类型还能提高查询和修改数据的性能.数据类型的选择标准既要满足业务和扩展性的需求,又要使行宽最小(行宽是一行中所有column占用的Byte).最佳实践:使用与Column最大值最接近的数据类型. 例如,bit 类型只能存储

mysql选择合适的数据类型

MySQL之选择字段数据类型 MySQL支持的数据类型很多,选择正确的数据类型对于 获得高性能至关重要.在选择时有个简单的原则有助于做出更好的选择. 简单的原则: A.通常最小的是最好的 因为这样可以用更少的磁盘.内容.CPU缓存,大大减少IO开销. B.简单就好 简单的数据类型操作通常需要更少的CPU周期.例如,整型比字符操作代价更小,因为字符集和校对规则(排序规则)使它比整型更复杂.比如应该使用MySQL内建的类型而不是使用字符型来存储日期和时间. C.尽量避免使用NULL NULL是列默认

8.2 第八章 选择合适的数据类型

8.3 浮点数与定点数 对于小数的表示,MySQL 分为两种方式:浮点数和定点数.浮点数包括 float(单精度)和 double(双精度),而定点数则只有 decimal 一种表示.定点数在 MySQL 内部以字符串形式存放,比浮点数更精确,适合用来表示货币等精度高的数据. 浮点数和定点数都可以用类型名称后加"(M,D)"的方式来进行表示,"(M,D)"表示该值一共显示 M 位数字(整数位+小数位),其中 D 位位于小数点后面,M 和 D 又称为精度和标度.例如,

选择合适的数据类型

DataType 决定了Column能够存储的数据范围和能够进行的操作,例如bit 类型只能存储1,0 和 null,而varchar(10)能够存储最多10个字符,并可以对该column使用字符串函数.数据类型的选择标准既要满足业务和扩展性的需求,又要使行宽到达最小(行宽是一行中所有column占用的Byte).最佳实践:使用与Column Maximum Value 最接近的数据类型. 1,窄行会节省存储空间,减少IO次数 在满足业务需求和扩展性要求的情况下,使用窄的数据类型,使行的宽度达到

mysql如何选择合适的数据类型1:CHAR与VARCHAR

CHAR和VARCHAR类型类似,都用来存储字符串,但它们"保存"和"检索"的方式不同.CHAR属于"固定长度"的字符串,而VARCHAR属于"可变长度"的字符类型. 下表显示了将各种字符串值保存到CHAR(4)和VARCHAR(4)列后的结果,说明了CHAR和VARCHAR之间的差别. CHAR和VARCHAR的对比 值 CHAR(4) 存储需求 VARCHAR(4) 存储需求 '' '    ' 4个字节 '' 1个字节

如何为MySQL选择更合适的数据类型

更小的通常更好 在表设计最开始之初,我认为这里的选择合适的数据类型是非常关键的,他可以尽可能减轻数据库的硬盘占用,和在查询的过程中越简单越小的数据类型则需要的占用了更小的cpu缓存,内存,硬盘,和相对应的处理cpu的周期. 简单就好 数据类型的选择应该保持越简单越好的准则, 比方说整形比起字符类型来说的代价更低,因为字符类型的校对规则和排序规则相对于整形来说更加复杂. 应该使用mysql 的内建类型而不是选择字符串来进行存储日期和时间,也应该使用整形来存储ip地址. 尽量避免NULL 而且应该避