金沙国际官网_金沙国际平台登录

因为这个金沙国际官网_金沙国际平台登录网站与很多的大型澳门赌场都有合作,金沙国际官网_金沙国际平台登录尽职尽责,高效执行,保持好奇心,不断学习,追求卓越,点击进入金沙国际官网_金沙国际平台登录马上体验吧,所以现在也正式地开始了营业。

您的位置:金沙国际官网 > 编程 > 二进制浮点数的表示,大数据内存查找

二进制浮点数的表示,大数据内存查找

发布时间:2019-11-03 00:52编辑:编程浏览(176)

     

    二、排序Product

      朋友在谈一个物流相关的项目,是以前项目的一个延续,涉及到后台的扩展,手机端的App,外加两个App的对接的蓝牙打印机。这个项目前后说了一个多月了吧,最近才草拟了协议。项目本来不复杂,但是客户却如此的拖延。我觉得客户做事好慢,而朋友觉得是自己的就是自己的,不是自己的急也没有用。不断的打电话询问客户,可能最后还被压价,反而更没办法做了。他其实比我还急,但是人家的心态好。的确凡事急不得。

    由于工作中需要对大量数据进行快速校验,试验采用读入内存List实体采用lamdba查找来实现。

    1.按名称对产品进行排序,以特定顺序显示一个列表的最简单方式就是先将列表排序,再遍历并显示其中的项。

     

    实际需求:实际读入内存数据 50W条记录主集数据,还包含约20个子集,子集最大记录数300W条记录。读入内存,校验出结果5分钟之内完成。

    C#1.1 使用IComparer对ArrayList进行排序

    浮点数

    测试数据读入内存后占用约2-3G内存。这里测试了多线程读取数据,但提速效果并不明显。SQLServer有自己的SQL执行排队机制(读入数据过程遇到一个小插曲,读入速度慢,占用内存大,无意中发现是把记录照片流也读入了内存。实际处理数据过程并不需要照片信息。去掉后速度提升很大,占用内存也缩小很多,以后遇到类似操作应提前排除这类情况了)

    product类

      在 C 语言中,有两种存储浮点数的方式,分别是 float 和 double ,当然了还有long double。这几种浮点型所容纳的长度不同,当然它们存储的精度也就不同了。

    数据校验脚本由另一个同事写的,大约有500个校验,实体字段合法性校验,及主集子集关联检验。开始拿到脚本丢进去测试,结果半个小时也没反应。果断结束进程。然后就是痛苦的优化过程,曾经怀疑这样的方式行不通。差不多用了两周时间,达到5000个主集信息10秒以内完成。50W数据也在3-5分钟完成。最后完成100个并发测试。校验结果正常返回。一切OK现已正常上线使用。

    图片 1图片 2

      对于整形而言,比如 int 、short 、char 之类的,在内存中的存储方式都是用 补码 进行表示。而浮点数在内存中并没有使用补码进行表示。浮点数在内存中存储的方式使用了 IEEE 的编码表示方式,即使用 符号指数 和 尾数 的形式进行存储的。

     

     1 using System.Collections;
     2 using System.ComponentModel;
     3 
     4 namespace Chapter01.CSharp1
     5 {
     6     [Description("Listing 1.01")]
     7     public class Product
     8     {
     9         string name;
    10         public string Name
    11         {
    12             get { return name; }
    13         }
    14 
    15         decimal price;
    16         public decimal Price
    17         {
    18             get { return price; }
    19         }
    20 
    21         public Product(string name, decimal price)
    22         {
    23             this.name = name;
    24             this.price = price;
    25         }
    26 
    27         public static ArrayList GetSampleProducts()
    28         {
    29             ArrayList list = new ArrayList();
    30             list.Add(new Product("West Side Story", 9.99m));
    31             list.Add(new Product("Assassins", 14.99m));
    32             list.Add(new Product("Frogs", 13.99m));
    33             list.Add(new Product("Sweeney Todd", 10.99m));
    34             return list;
    35         }
    36 
    37         public override string ToString()
    38         {
    39             return string.Format("{0}: {1}", name, price);
    40         }
    41     }
    42 }
    

     

    以下是在本次数据校验实现过程中总结出来应注意的一些地方。

    View Code

    IEEE浮点数表示


    ArrayListSort类

      用 IEEE 编码表示浮点数,需要 3 部分进行表示,分别是 符号指数 和 尾数。符号位占用 1 位,0 表示正数,1 表示负数。指数 和 尾数 根据 float 和 double 类型的不同而长度不同。

    1、由原来数据库校验改为内存校验,内存速度更快,数据库校验还会带来并发等待,死锁等问题。

    图片 3图片 4

      

    2、加载数据可以采用多线程加载

     1 using System;
     2 using System.Collections;
     3 using System.ComponentModel;
     4 
     5 namespace Chapter01.CSharp1
     6 {
     7     [Description("Listing 1.05")]
     8     class ArrayListSort
     9     {
    10         class ProductNameComparer : IComparer
    11         {
    12             public int Compare(object x, object y)
    13             {
    14                 Product first = (Product)x;
    15                 Product second = (Product)y;
    16                 return first.Name.CompareTo(second.Name);
    17             }
    18         }
    19 
    20         static void Main()
    21         {
    22             ArrayList products = Product.GetSampleProducts();
    23             products.Sort(new ProductNameComparer());
    24             foreach (Product product in products)
    25             {
    26                 Console.WriteLine(product);
    27             }
    28         }
    29     }
    30 }
    

      IEEE 二进制浮点数的表示:

    3、主键使用整形加快查询速度 这一点特别重要,速度提升上千倍。

    View Code

    位数  符号位  指数位  尾数位
    32     1            8           23     单精度(float)
    64     1           11          52     双精度(double)

    4、采用lamdba表达式查找数据 用联合查询代替for循环

    提供一个IComparer实现,比较器。或者Product类实现IComparable。

     

    5、根据数据量的大小采用分别采取线性查找或二分查找提高查询速度

    区别:IComparer和IComparable(比较器接口和可比较的接口)

    编码转换

    6、共用数据只取一次,在整个校验中全局使用。

    缺陷:Compare方法中显示强制类型转换,而ArrayList是类型不安全的,转换为对象Product时可能报错。foreach循环中隐式的编译器自动类型转换,转换为Product类型执行时可能报错。

    以单精度为例:把3.75用IEEE表示法表示

    并发测试 时发现 静态类中的静态属性不是安全的 因为静态类在内存中只有一份 去掉static 后多线程测试正常

    2.C#2.0 引入泛型,使用IComparer<Product>对List<Product>进行排序

    1、把 10 进制转换为2进制:3.75D=11.11B

     

    product类

    2、 尾数正规化                     1.111*2^1

    以下为测试数据,及相关说明,可以直接忽略。感兴趣的的可以看看。

    图片 5图片 6

    3、 修正指数                         1+127=128 1000 0000


     1 using System.Collections.Generic;
     2 using System.ComponentModel;
     3 
     4 namespace Chapter01.CSharp2
     5 {
     6     [Description("Listing 1.02")]
     7     public class Product
     8     {
     9         string name;
    10         public string Name
    11         {
    12             get { return name; }
    13             private set { name = value; }
    14         }
    15 
    16         decimal price;
    17         public decimal Price
    18         {
    19             get { return price; }
    20             private set { price = value; }
    21         }
    22 
    23         public Product(string name, decimal price)
    24         {
    25             Name = name;
    26             Price = price;
    27         }
    28 
    29         public static List<Product> GetSampleProducts()
    30         {
    31             List<Product> list = new List<Product>();
    32             list.Add(new Product("West Side Story", 9.99m));
    33             list.Add(new Product("Assassins", 14.99m));
    34             list.Add(new Product("Frogs", 13.99m));
    35             list.Add(new Product("Sweeney Todd", 10.99m));
    36             return list;
    37         }
    38 
    39         public override string ToString()
    40         {
    41             return string.Format("{0}: {1}", name, price);
    42         }
    43     }
    44 }
    

    4、 符号 0表示正,1表示负

    1、7万条记录

    View Code

    5、 IEEE表示                         0 1000 0000 1110 0000 0000 0000 0000 000

    A01.FindAll(x => !x.PersonStatus.In("01", "02", "03", "04"))

    ListSortWithComparer类

    6、 转换为16进制:              0100 0000 0111 0000 0000 0000 0000 0000   40 70 00 00 

    循环查找,共加载15298人,耗时:0.019519秒.

    图片 7图片 8

     

    A01.FindAll(x => !(x.PersonStatus == "01" || x.PersonStatus == "02" || x.PersonStatus == "03" || x.PersonStatus == "04"))

     1 using System;
     2 using System.Collections.Generic;
     3 using System.ComponentModel;
     4 
     5 namespace Chapter01.CSharp2
     6 {
     7     [Description("Listing 1.06")]
     8     class ListSortWithComparer
     9     {
    10         class ProductNameComparer : IComparer<Product>
    11         {
    12             public int Compare(Product first, Product second)
    13             {
    14                 return first.Name.CompareTo(second.Name);
    15             }
    16         }
    17 
    18         static void Main()
    19         {
    20             List<Product> products = Product.GetSampleProducts();
    21             products.Sort(new ProductNameComparer());
    22             foreach (Product product in products)
    23             {
    24                 Console.WriteLine(product);
    25             }
    26         }
    27     }
    28 }
    

    用 C 程序进行验证

    循环查找,共加载15298人,耗时:0.0284169秒.

    View Code

      写一个简单的 C 程序来验证上面的转换,代码如下:

     

    使用Comparison<Product>对List<Product>进行排序(C#2),不需要实现ProductNameComparer比较器类型,只是创建一个委托实例(C#2.0 匿名方法)。

     1 #include <stdio.h>
     2 
     3 int main()
     4 {
     5     float f = 3.75f;
     6 
     7     printf("%f rn", f);
     8 
     9     return 0;
    10 }
    

    2、3.3万条记录 x.CodeID == "ZB01"的有3300条记录

    图片 9图片 10

      以上代码用 VS 2012 编译,调试运行查看内存,如下图所示。

    本文由金沙国际官网发布于编程,转载请注明出处:二进制浮点数的表示,大数据内存查找

    关键词: