我现在有1百七万条数据,要装到数组中去,请问一下,数组可以装下吗?决定数组容量的东西是什么

解决方案 »

  1.   

    动态数组介绍----Delphi 自从有了动态数组,链表除了在教科书里出现外,已经很少在实际编程中被使用了,事实也是如此,数组的确比传统链表快得多,而且也方便的多。    从 Delphi4起,开始了内建各种类型的动态数组支持。但是,对我们来说动态数组支持似乎做的不够彻底,因为Delphi竟然连删除、插入、移动连续元素的函数都没有提供,让人使用起来总觉得不够爽!!! J 。作为一名程序员,我们当然要有自己解决问题的能力,下面就让我们简单介绍一下Delphi 下的动态数组。在Delphi中,数组类型有静态数组(a : array[0..1024] of integer)、动态数组(var a : array of integer)、指针数组(即指向静态数组的指针)和开放数组(仅用于参数传递)。静态数组、指针数组有速度快的好处,动态数组有大小可变的优势,权衡之下就有了折衷的办法,那就是定义的动态数组在必要时转换为指针。动态数组声明之后,只有下面几个函数可供操作:1.  设置数组大小,可以任意缩减或增加数组大小Procedure SetLength(var S ; NewLength : integer);2.  取出连续元素,复制给另一个数组变量Function Copy(s;Index,Count : integer) : array ;3.  取得数组大小及上下限Function Length(s):integer;Function High(x):integer;Function Low(x):integer;值得注意的是,不加const或var修饰的动态数组会被作为形参传递,而动态数组用const修饰并不意味着你不能修改数组里的元素(不信你可以字自己在程序中试试。还有一点是High函数调用了Length 函数,所以我们在获取数组上限时最好直接用 Length(s) 函数。动态数组在内存空间中占用4个字节.   动态数组在内存中的分配表如下:偏移量                                      内容-8                                   32-bit 引用计数-4                                   32-bit 数组长度0..数组长度 * (元素尺寸) - 1   数组元素    元素尺寸=Sizeof(元素类型)根据上面的分配情况,可以得到如下结果:如果我们想要清空一个动态数组只需要把“数组长度”和“引用计数”清空即可。”引用上面的一句话就是:“权衡之下就有了折衷的办法,那就是定义的动态数组在必要时转换为指针。”下面是清空动态数组的函数:procedure DynArraySetZero(var A);var  P: PLongint; //占用4个字节,正好符合 32 位内存排列begin  P := PLongint(A); // 指向 A 的地址  Dec(P); //P 地址偏移量是 sizeof(A),指向了数组长度  P^ := 0; // 长度清空  Dec(P); // 指向引用计数  P^ := 0; //计数清空。end;上面的函数就这么简单,而且效率也非常高。下面让我们再来看看怎样删除动态数组中的元素,函数体如下:{************************************ A 变量类型  , elSize = SizeOf(A) index 开始删除的位置索引 ,Count 删除的数量****************************************}procedure DynArrayDelete(var A; elSize: Longint; index, Count: Integer);var  len, MaxDelete: Integer;   P : PLongint; //4 个字节的长整形指针begin  P := PLongint(A);// 取的 A 的地址  if P = nil then    Exit;  {下面这句完全等同于 Dec(P) ; len := P^  因为 Dec(P) = Pchar(P) – 4  同样是移动4 字节的偏移量,只不过后者按字节来移动    }len := PLongint(PChar(P) - 4)^; // 变量的长度 ,偏移量 -4   if index >= len then //要删除的位置超出范围,退出    Exit;  MaxDelete := len - index; // 最多删除的数量  Count := Min(Count, MaxDelete); // 取得一个较小值  if Count = 0 then // 不要求删除    Exit;  Dec(len, Count);// 移动到要删除的位置   MoveMemory(PChar(P)+index*elSize , PChar(P)+(index + Count)*elSize , (len-index)*elSize); //移动内存  Dec(P);  //移出 “数组长度”位置  Dec(P);  //移出“引用计数” 位置  //重新再分配调整内存,len 新的长度. Sizeof(Longint) * 2 = 2*Dec(P)  ReallocMem(P, len * elSize + Sizeof(Longint) * 2);  Inc(P); // 指向数组长度  P^ := len; // new length   Inc(P); // 指向数组元素,开始的位置  PLongint(A) := P;end; 对上面的例子,我们需要注意的是 elSize 参数 ,它必须是 SizeOf(DyArray_Name),表示元素所占用的字节数。    相信看了上面的例子后,对于动态数组的拷贝,移动想必也可以自己实现了吧 J后续:    其实,Delphi 对许多类型的内存分配都很相似,比如 string 类型,其实它和动态数组是很相似的,我们完全可以把它拿来当成动态数组。实质上 string 是 Pchar 的简易版本。不管怎么说,了解一些内存的分配对我们这些开发人员来说还是有一些好处的。=============
    最好用数据库,好管理
      

  2.   

    上面意思就是说,你只要不超过delphi里允许的最大的数就行了,超过了,数组的下表就没法用了,嘿嘿
      

  3.   

    和你程序的Stack有关系,在你的project->option->Linker->Max stack size最大为$1000000,能申请的数组最大为134217728.如果是整数数组,能申请419万个长度.
      

  4.   

    先考虑gzmhero(hihihi) 所有的,然后windows还有其他限制: 
    Data type too large: exceeds 2 GB
    数据类型大小不能超过2G,sizeof(你的数据类型)*数组长度<2G楼主即使能把170w多条数据一起装进来,恐怕是一个不小的内存开销,估计一般的系统都承受不了吧,楼主最好考虑其他方法了
      

  5.   

    能使用多少内存,是由windows决定的“所有 32 位应用程序都有 4 GB 的进程地址空间(32 位地址最多可以映射 4 GB 的内存)。对于 Microsoft Windows 操作系统,应用程序可以访问 2 GB 的进程地址空间,称为用户模式虚拟地址空间。应用程序拥有的所有线程都共享同一个用户模式虚拟地址空间。其余 2 GB 为操作系统保留(也称为内核模式地址空间)。所有操作系统版本(从 Windows 2000 Server 开始,包括 Windows Server 2003)都有一个 boot.ini 开关,可以为应用程序提供访问 3 GB 的进程地址空间的权限,从而将内核模式地址空间限定为 1 GB。”也就是说在程序里,一般能分配的内存最大数量也就是2GB