解决一个千万级别的数组引发的问题的深入剖析

问题:

要产生一千万个7位的随机数。定义一个千万int元素的数组。

#define N10000000

intmain()

{

int a[N] = {0};

}

这时候程序可以编译通过,但是一运行就会出现segment fault。

问题的分析:

既然程序能编译通过,不是compile-time之类的错误,肯定是run-time类的错误,而run-time错误,肯定是和堆栈的问题相关。由于数组很大,而且数组是静态的,初步猜想是栈溢出的原因。

问题的解决:

将数组的定义改为

int main()

{

static int a[N] = {0};

}

程序可以运行了。

问题的深入思考:

为什么这样定义数组不行呢,为什么会栈溢出呢。

1.      首先看看linux程序的进程内存结构

我们对比一下前后两种定义方式的程序各个区的大小用命令size 可执行程序名

第一种方式定义:

 

这时候数据肯定归为栈区,各个数据块都不大。

第二种方式定义:

这时候数据在bss静态未初始化区。

由上面的各个区的分析我们可以知道,刚开始我们在main函数中定义的数组属于非静态的局部变量,是放在栈区的,可是为什么会溢出呢,linux规定的栈区大小是多少?

在linux上查看栈区的大小运行命令:ulimit –s

我们定义的数组大小接近40M,而栈区大小最大是10M肯定就会溢出了。

问题的最后:

总而言之,要定义很大的数组,不能放在栈区。可以声明为局部的静态数组,或全局数组。或者你可以修改linux规定的栈区的上限。

时间: 2024-10-05 23:55:06

解决一个千万级别的数组引发的问题的深入剖析的相关文章

如何设计一个日访问量千万级别的系统,谈oracle的高级设计和开发(1)

假如要开发一个日访问量百万级别.甚至千万级别访问量的互联网平台,性能和安全是首要考虑的因素.单从性能上讲,主要从以下几个方面考虑: 1)       硬件及网络设备: 2)       分布式.集群.读写分离.CDN加速等: 3)       使用优秀的开发框架,充分利用缓存机制: 4)       良好的数据库设计规划,包括数据库集群,关系型数据库+非关系型数据库结合: 5)       高性能的开发语言编程,特别是数据库部分的编程: 等等. 建设一个中大型互联网平台,是有技术含金量的,抛开硬

连载:告诉你如何设计一个日访问量千万级别的系统,谈oracle的高级设计和开发(2)

接下来正式开篇讲解在实际中大型项目中oracle的高级设计及开发的内容,以下讲解的oracle内容以及示例程序都是基于oracle11R2. 为了防止脱离实际地搞一堆理论,本人尽量用实际工作中的例子来说明问题,当然一些必要的理论有时候还是需要讲解,因为说的内容是高级设计及开发,入门级的SQL以及数据库概念将不会做详细讲解. 绝大多数IT项目,都是围绕数据库进行各种业务的,所以也有人将这类项目称为数据库项目,也就是说数据库是重点,有过项目设计经验的都知道,好的数据库设计,可以让开发和维护变得简单,

程序员修仙之路--优雅快速的统计千万级别uv

菜菜,咱们网站现在有多少PV和UV了? Y总,咱们没有统计pv和uv的系统,预估大约有一千万uv吧 写一个统计uv和pv的系统吧 网上有现成的,直接接入一个不行吗? 别人的不太放心,毕竟自己写的,自己拥有主动权.给你两天时间,系统性能不要太差呀 好吧~~~ 定义PV是page view的缩写,即页面浏览量,通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标.网页浏览数是评价网站流量最常用的指标之一,简称为PV UV是unique visitor的简写,是指通过互联网访问.浏览这个网页的自

优雅快速的统计千万级别uv

定义 PV是page view的缩写,即页面浏览量,通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标.网页浏览数是评价网站流量最常用的指标之一,简称为PV UV是unique visitor的简写,是指通过互联网访问.浏览这个网页的自然人. 通过以上的概念,可以清晰的看出pv是比较好设计的,网站的每一次被访问,pv都会增加,但是uv就不一定会增加了,uv本质上记录的是按照某个标准划分的自然人,这个标准其实我们可以自己去定义,比如:可以定义同一个IP的访问者为同一个UV,这也是最常见的u

如何搭建千万级别用户的应用系统

基本情况 l AWS覆盖全世界12个国家区域 1. 每个区域都对应着世界上的一个物理位置,每个位置都有弹性计算云提供多个可用区域(Availability Zones),这些区域包含北美.南美.欧洲.中东.非洲.亚太等地区. 2. 每个可用区域(AZ)实质上是单个数据中心,尽管它可由多个数据中心构造. 3. 每个可用区域都拥有很强的隔离性,他们各自拥有独立的电源和网络. 4. 可用区域之间只能通过低延迟网络互相连接,它们可以相距5或15英里,但网络的速度相当快以至于你的应用程序像在同一个数据中心

Java千万级别数据生成文件思路和优化

一年前写过一个百万级别数据库数据生成配置xml文件的程序,程序目的是用来把数据库里面的数据生成xml文件.程序可以配置多少文件生成到一个文件中去. 程序刚开始设计的时候说的是最多百万级别数据,最多50W数据生成到一个xml文件里面去,所以在做测试的时候自己也只是造了100W的数据并没有做过多数据量的测试,然后问题就来了....由于程序使用的局点数据量巨大,需要生成xml文件的客户资料接近千万级别的程度,而现场对程序的配置大约是100W条数据生成一个xml文件里面去,程序在这样的大数据量下面偶尔会

结对开发之返回一个二维整数数组中最大联通子数组的和

一.题目要求 输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和 二.解题思路 先对二维数组进行了重构,形成一个环状二维数组,然后再用求二维数组子矩阵最大和的方法求得最终结果. 三.程序代码 2 #include<iostream.h> 3 int main(int argc, char* argv[]

返回一个二维整数数组中最大联通子数组的和

题目: 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 要求: 两人结对完成编程任务. 一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划. 发表一篇博客文章发表一篇博客文章讲述设计思想,出现的问题,可能的解决方案(多选).源代码.结果截图.总结. 思想: 在看到本题目后,想了很久也没有想到比较满意的解决方法,觉得题目比较难,超出了我的能力范围.不过,个人认为可能用到了图论的知识,但是学的不好.根据上图给定的二维数组求解最大联通数组也许比较简单.以一个非负

返回一个二维整数数组中最大子数组的和

题目:返回一个二维整数数组中最大子数组的和.要求:输入一个二维整形数组,数组里有正数也有负数.      二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和.      求所有子数组的和的最大值.要求时间复杂度为O(n). 结对编程要求:两人结对完成编程任务.              一人主要负责程序分析,代码编程.              一人负责代码复审和代码测试计划.              发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照)