C语言生成2000w行数据
最近一直抽空学习shell,脚本语言看多了多多少少有些蛋疼不适,所以捡起以前遇到的一个C语言的问题看看。
原先应该是在C++吧关注的一个帖子,楼主为了测试数据库性能需要如下形式的数据
要求:
- 字符串长度为16
- 字符串只能包含大小写字母和数字
- 要求生成20000000行的TXT文本
/**********************************
* Author: Ervin_Zhao(2012.6)
* Compile: gcc
* Create a file named test.txt, included 2000w line random string
* string have 16 num used A-Z, a-z, 0-9
*/ #include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h> int main(void)
{
char array[]="QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890";
char buff[170000];
char *buff2 = buff;
int file = open("test.txt", O_WRONLY|O_CREAT, S_IRWXU|S_IRGRP|S_IROTH);
int i;
int temp[4];
char *p = (char *)temp;
for(i = 0; i<20000000; i++)
{
temp[0] = rand();
temp[1] = rand();
temp[2] = rand();
temp[3] = rand(); buff2[0] = array[p[0]%(sizeof(array)-1)];
buff2[1] = array[p[1]%(sizeof(array)-1)];
buff2[2] = array[p[2]%(sizeof(array)-1)];
buff2[3] = array[p[3]%(sizeof(array)-1)]; buff2[4] = array[p[4]%(sizeof(array)-1)];
buff2[5] = array[p[5]%(sizeof(array)-1)];
buff2[6] = array[p[6]%(sizeof(array)-1)];
buff2[7] = array[p[7]%(sizeof(array)-1)]; buff2[8] = array[p[8]%(sizeof(array)-1)];
buff2[9] = array[p[9]%(sizeof(array)-1)];
buff2[10] = array[p[10]%(sizeof(array)-1)];
buff2[11] = array[p[11]%(sizeof(array)-1)]; buff2[12] = array[p[12]%(sizeof(array)-1)];
buff2[13] = array[p[13]%(sizeof(array)-1)];
buff2[14] = array[p[14]%(sizeof(array)-1)];
buff2[15] = array[p[15]%(sizeof(array)-1)]; buff2[16] = '\n';
buff2 += 17; if(buff2 >= (buff+sizeof(buff)))
{
write(file, buff, sizeof(buff));
buff2 = buff;
}
}
close(file);
return 0;
}
这个程序结构的清晰,易于理解,真是个不错的程序
最初收藏的时候没时间去看,最近有空细看了下,在生成随机数那里看了半天,自己的底子实在是有点薄、
通过实验,原理是这样的。定义为INT形的数组,rand();函数产生8位的十六进制数,四个元素的数组,那么就是32位。
通过p指针把数组重新“翻译”,作为字符读取,2位一个字符,那么就是16个字符。通过array[p[0]%(sizeof(array)-1)]就可以随机取得array中的字符了
而且为了避免频繁读写IO,内存中待数据1万行才写入文件中,勉强看懂,叫自己写肯定是写不出。这就是学过和学会C语言的区别吧、
下面来看看另一个程序
/**********************************
* Author:yjf_victor(2012.6)
* Compile: gcc
* Create a file named test.txt, included 2000w line random string
* string have 16 num used A-Z, a-z, 0-9
*/ #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <time.h> int main ( void )
{
int i, j;
const int cols = 16;
const int rows = 20000000;
const int size = ( cols + 1 ) * rows;
const char str[] = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890";
const char filename[] = "file.txt";
char * p = NULL;
char * pStart = NULL;
int fd;
p = pStart = (char *)malloc( size * sizeof(char) );
if ( p == NULL )
{
fprintf ( stderr, "内存申请失败。\n" );
return EXIT_FAILURE;
}
srand( time(NULL) );
for ( i = 0 ; i < rows; i ++ )
{
for ( j = 0 ; j < cols; j ++ )
{
*(p ++) = str[rand()%(62)];
}
*(p ++) = '\n';
}
fd = open( filename, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR );
if ( fd == -1 )
{
fprintf ( stderr, "文件打开错误。\n" );
return EXIT_FAILURE;
}
write ( fd, pStart, size );
free( pStart );
close(fd);
return EXIT_SUCCESS;
}
本以为这个更难一些呢,读起来确是很好理解。而且程序写的很棒,参数易于修改
有时想想,大一学的C语言,也不深入学习,也不去实践、也只够写个学生信息管理系统了。
这个生成2000w行数据的,估计我会一个一个的生成随机数,然后估计一顿饭的时间是等不出来结果了…==
有吧友也通过汇编实现1秒5,由于没有环境,就不运行了,有兴趣的可以去看原帖,原帖地址:http://tieba.baidu.com/p/1626351476 (已为坟,勿回)
想来shell应该也能实现这一要求,所以去弄了个shell版本的
tr -dc A-Za-z0-9 < /dev/urandom |fold -w 16 |head -20000000 > file.txt
比较简单,一行码~嘿嘿,效率嘛、有舍就有得嘛~~
初学shell就是伤不起。。。连入门都没,别说写出高效简洁的shell脚本了,本来这个shell想自己写来着,但是下意识的想去用C语言的过程化设计来实现,思维有很多时候跳不出来
这真是。。。路漫漫,慢慢走吧、、
C语言生成2000w行数据的更多相关文章
- sql server之ROW_NUMBER() OVER()取每组的第N行数据
先看个例子: document_id card_holder_id created_date document_type_id 1 1 2015-7-1 1 2 4 2015-7-2 1 3 4 20 ...
- 逗号分隔的字符串转换为行数据(collection)(续)
逗号分隔的字符串转行数据的存储过程一个: CREATE OR REPLACE FUNCTION SP_YX_SPLIT ( p_list CLOB, p_sep VARCHAR2 := ',' ) R ...
- 逗号分隔的字符串转换为行数据(collection)
逗号分隔的字符串转换为行数据(collection) CREATE OR REPLACE FUNCTION "GET_STR_TAB" (v_str in varchar2) re ...
- hive中同列多行数据组合的方法以及array to string要点(行转列)
1. 同列多行数据组合成一个字段cell的方法, top N 问题的hive方案 如下: hive 列转行 to json与to array list set等复杂结构,hive topN的提取的窗口 ...
- PHP 表单提交多行数据,显示多个submit
echo "<table border=1 class="imagetable" >"; //使用表格格式化数据echo "<for ...
- 怎样为DataTable设置主键及找行数据
只要是数据集中都应该存在主键,以确定数据集中唯一的值.那么,我们要如何为DataTable设置主键及利用主键在DataTable索引值呢? 步骤/方法 为DataTable设置主键 DataT ...
- Oracle一列的多行数据拼成一行显示字符
Oracle一列的多行数据拼成一行显示字符 oracle 提供了两个函数WMSYS.WM_CONCAT 和 ListAgg函数. www.2cto.com 先介绍:WMSYS.WM_CO ...
- 05. 取SQL分组中的某几行数据
对表中数据分组,有时只需要某列的聚合值:有时却需要返回整行数据,常用的方法有:子查询.ROW_NUMBER.APPLY,总体感觉还是ROW_NUMBER比较直观.测试数据: if OBJECT_ID( ...
- ADO.NET笔记——使用Connection连接数据库,使用Command对象的ExecuteReader()方法创建DataReader对象返回多行数据
使用Connection连接数据库,使用DataReader访问数据库,并返回多行数据. 相关步骤: 需要引入两个命名空间 using System.Data; using System.Data.S ...
随机推荐
- 动态生成Zip
动态生成Zip文档 通过前面一篇烂文的介绍,大伙儿知道,ZipArchive类表示一个zip文档实例,除了用上一篇文章中所列的方法来读写zip文件外,还可以直接通过ZipArchive类,动态生成 ...
- 监测谁用了SQL Server的Tempdb空间
原文:监测谁用了SQL Server的Tempdb空间 转自:http://blogs.msdn.com/b/apgcdsd/archive/2011/02/11/sql-server-tempdb. ...
- css Tab选项卡2
注意上述 红色方框 这个是锚点的变相 以及overflow:hiden结合, 利用 锚点对应 id , 也可以实现. 兼容ie6+ 适合手机tab 简单 不需要脚本 其实还可以利用 ...
- latex如何输入正确的 双引号
latex当输入双引号,假设直接用双引号键在键盘上.玩过顺-handed. 引述左输入法是正确的:按两次"Tab在之上,数字1左边的键".至于后面行情,该方法是一样的老,这是两次单 ...
- NSIS:应用软件自动升级功能的探索与实践
原文 NSIS:应用软件自动升级功能的探索与实践 记得以前轻狂曾分享过使用第三方软件实现应用软件自动升级功能 (详细http://www.flighty.cn/html/soft/20110106_1 ...
- ARP协议的基础知识
关于ARP协议的基础知识 1.ARP的工作原理 本来我不想在此重复那些遍地都是的关于ARP的基本常识,但是为了保持文章的完整性以及照顾初学者,我就再啰嗦一些文字吧,资深读者可以直接跳过此节 ...
- c++ primer plus(文章6版本)中国版 编程练习答案第八章
编程练习答案第八章 8.1写输出字符串的函数,存在默认参数表示输出频率,莫感觉1.(原标题太扯了,的问题的细微变化的基础上,含义) //8.1编写一个输出字符串的函数.有一个默认參数表示输出次数,默觉 ...
- KMP算法之从next[]到nextVal[] (转)
前些日子写了一篇KMP算法的博文,浅谈数据结构之KMP(串中的模式匹配算法),在这片文章中,谈到了一个模式串K值的记录数组 next[],详细可看那篇文章,其实,前面定义的next[]数组是有一定缺陷 ...
- Configuration配置信息管理
Configuration配置信息管理 在前面的章节中,我们知道新版的MVC程序抛弃了原来的web.config文件机制,取而代替的是config.json,今天我们就来深入研究一下配置文件的相关内容 ...
- oracle_windows下命令启动oracle监听和服务
1.检查监听器状态 C:\Users\Administrator>lsnrctl status 2.启动监听程序 C:\Users\Administrator>lsnrctl start ...