...........挑战数据库查询和文件读写极限......

hzhxxx 2007-01-16 04:58:11
...........挑战数据库查询和文件读写极限......

需要把数据库中一个数据表 3600W 条记录读出,写成一个 txt 文本文件
一条记录对应 txt 文件中的一行数据,有什么比较快的方式
1. 目前我准备每次取出100 条记录后通过(每次最多取这么多) 异步IO 的方式把数据写入
文本文件,这样我也需要 循环 36000次,每次就算0.5秒,但是这样初步计算了一下,大致
也要5 个小时啊,客户没法答应,怎么办
...全文
291 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hzhxxx 2007-01-18
  • 打赏
  • 举报
回复
/*
WriteFileTest()
{
Console.WriteLine(DateTime.Now.ToString());

FileStream fStream = new FileStream("c:\\bb.txt",FileMode.Append);
const int length = 1024 * 6;
StringBuilder strvalue = new StringBuilder();
//Console.WriteLine("read start" + DateTime.Now.Millisecond.ToString());
for(int i = 0; i < 70000;++i)
{
for(int k = 0;k < 100;++k)
{
strvalue.Append(i);
strvalue.Append(";11");
strvalue.Append(";22");
strvalue.Append(";ggg");
strvalue.Append(";fffff");
strvalue.Append(";aaaa");
strvalue.Append(";22");
strvalue.Append(";ggg");
strvalue.Append( ";fffff");
strvalue.Append(";发大幅度");
strvalue.Append(";aaaa");
strvalue.Append( ";fffff");
strvalue.Append(";发大幅度");
strvalue.Append("\r\n");
}

//Console.WriteLine("read end" + DateTime.Now.Millisecond.ToString());
byte[]ImageContent = System.Text.Encoding.Default.GetBytes(strvalue.ToString());
//Console.WriteLine("write start" + DateTime.Now.Millisecond.ToString());
fStream.Write(ImageContent,0,ImageContent.Length);
//Console.WriteLine("write end" + DateTime.Now.Millisecond.ToString());
strvalue.Remove(0,strvalue.Length);
}
fStream.Close();
Console.WriteLine(DateTime.Now.ToString());
}
经过测试,这段代码的运行速度是最快的,写一个 477M 的文件耗时25s,效率的
瓶颈是内部的100次循环,组装字符串,IO 写操作非常快

各位看还有什么优化的措施

*/
hzhxxx 2007-01-17
  • 打赏
  • 举报
回复

经过测试 ,做 70000 次循环,每次循环里面再 100 次循环(模拟取数据),
使用 stringbuilder 预先开 1024 * 128 k 内存,循环使用这段内存,
最终写到一个文本文件。

同步模式: 25s,异步模式 26m,文件大小 为 477431KB,测试结果表明同步比异步快,
单线程模式
bitpolar 2007-01-16
  • 打赏
  • 举报
回复
这也算极限???
0.5秒执行一次也太慢了吧
一般服务器(我们公司服务器大致2W块钱左右)通过WebService执行登录大约支持1000次/秒
hzhxxx 2007-01-16
  • 打赏
  • 举报
回复

部署数据库备份一类的,导出的数据还要加工处理,比如说某个字段是值 1 写入文本文件是 正确,2 写入是错误
hzhxxx 2007-01-16
  • 打赏
  • 举报
回复

不能到数据库上操作,一定是需要调用别人的存储过程(别人提供的方法),所以每次才能得到100 条记录的限制,这个是无法改变的了
runrunrun 2007-01-16
  • 打赏
  • 举报
回复
用bcp命令
mobydick 2007-01-16
  • 打赏
  • 举报
回复
数据库图标上点右键->所有任务->导出数据
TheRule 2007-01-16
  • 打赏
  • 举报
回复
直接从数据库导出为一个txt文件不行吗?
joleo 2007-01-16
  • 打赏
  • 举报
回复
这个txt还打得开吗?

*****************************************************************************
http://www.poge.com.cn
三省Ta叔 2007-01-16
  • 打赏
  • 举报
回复
执行一次需要那么久吗?那不干脆找个打字的敲进去

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧