开启20个线程去读取txt文件
一个txt 大概有20W 行,我要把每行读取出来插入数据库,但是速度太慢,
如何开启20个线程去读取,然后插入数据库???
------解决方案--------------------
string[] AllLine = File.ReadAllLine(@"c://1.txt");
Foreach(var item in AllLine){
Insert(item);
}
static void Main(string[] args)再上测试结果,多次测试结果相差不大
{
fileThread fileThread = new fileThread(@"E:\data\WebSite\ShowJim.com.rar", @"e:\windows2003sql2000.GHO");
for (int threadCount = 1; threadCount != 10; ++threadCount) fileThread.WaitThread(threadCount);
Console.WriteLine("end...");
Console.ReadKey();
}
/// <summary>
/// 多线程文件读取测试
/// </summary>
private class fileThread
{
/// <summary>
/// 测试文件名
/// </summary>
private string fileName;
/// <summary>
/// 硬盘缓存刷新文件名,文件必须大于空闲内存数量
/// </summary>
private string memoryCacheFileName;
/// <summary>
/// 测试线程数量
/// </summary>
private int threadCount;
/// <summary>
/// 已完成线程数量
/// </summary>
private int finallyThreadCount;
/// <summary>
/// 测试文件数据缓冲区
/// </summary>
public byte[] Data { get; private set; }
/// <summary>
/// 多线程同步访问锁
/// </summary>
private readonly object threadLock = new object();
/// <summary>
/// 多线程文件读取测试
/// </summary>
/// <param name="fileName">测试文件名</param>
/// <param name="memoryCacheFileName">硬盘缓存刷新文件名,文件必须大于空闲内存数量</param>
public fileThread(string fileName, string memoryCacheFileName)
{
this.fileName = fileName;
this.memoryCacheFileName = memoryCacheFileName;
using (System.IO.FileStream file = System.IO.File.OpenRead(fileName)) Data = new byte[file.Length];
Console.WriteLine("测试文件: " + fileName + " 文件大小: " + Data.Length.ToString() + "B");
using (System.IO.FileStream file = System.IO.File.OpenRead(memoryCacheFileName))
{
Console.WriteLine("硬盘缓存刷新文件: " + memoryCacheFileName + " 文件大小: " + file.Length.ToString() + "B");
}
}
/// <summary>
/// 测试开始
/// </summary>
/// <param name="threadCount">测试线程数量</param>
public void WaitThread(int threadCount)
{
#region 硬盘缓存刷新
byte[] data = new byte[1 << 20];
using (System.IO.FileStream file = System.IO.File.OpenRead(memoryCacheFileName))
{
for (int count = (int)(file.Length / data.Length); count != 0; --count) file.Read(data, 0, data.Length);
}
#endregion
System.Diagnostics.Stopwatch time = new System.Diagnostics.Stopwatch();
time.Start();
this.threadCount = threadCount;
finallyThreadCount = 0;
while (threadCount != 0) new System.Threading.Thread(read).Start(threadCount--);
System.Threading.Monitor.Enter(threadLock);
System.Threading.Monitor.Wait(threadLock);
System.Threading.Monitor.Exit(threadLock);
time.Stop();
Console.WriteLine("测试线程数量: " + finallyThreadCount.ToString() + " 测试文件消耗时间: " + time.Elapsed.TotalSeconds.ToString() + "s");
}
/// <summary>
/// 读取文件线程处理
/// </summary>
/// <param name="threadNO">线程序号</param>
private void read(object threadNO)
{
int length = Data.Length / threadCount, thread = (int)threadNO, startIndex = (thread - 1) * length;
using (System.IO.FileStream file = System.IO.File.OpenRead(fileName))
{
file.Seek(startIndex, System.IO.SeekOrigin.Begin);
file.Read(Data, startIndex, thread == threadCount ? Data.Length - startIndex : length);
}
System.Threading.Monitor.Enter(threadLock);
if (++finallyThreadCount == threadCount) System.Threading.Monitor.Pulse(threadLock);
System.Threading.Monitor.Exit(threadLock);
}
}
其实不必和我纠结,我对这些东西不感兴趣,很久不玩编程了,没什么意思
[解决办法]
虚拟机配置:
[解决办法]
求私信 MP4文件读写库!大神 好久没见啊
2.每次测试重启虚拟机
2.每次测试重启虚拟机
对于虚拟机有两点疑问:
1.虚拟机硬盘访问最终还是要访问宿主系统的硬盘缓存,启动虚拟机能否刷掉宿主系统的硬盘缓存要看空闲内存的大小、启动虚拟机读取量、虚拟机系统实际使用内存大小。
2.虚拟机访问硬盘是存在非硬盘访问阻塞因素的(源于虚拟机对于硬盘的文件的组织结构管理),影响类似于360流氓软件(当然影响没有那么严重)。当然随着虚拟机的流行,虚拟机测试也是一种应该考虑的情况,也许可以这样说:虚拟机中大文件的访问使用多线程能够提高效率。
这事的瓶颈在于硬盘的性能上吧,无论你是几个线程,把硬盘读取速度撑满了事啊。
而硬盘读取速度又因为当前文件缓存,硬盘本身缓存使用,甚至文件内容本身所在磁道位置,而会有不同的速度曲线。
我觉得不同环境里面对多线程读取文件的测试结果会有不一样的结果,但是整体来说,读取速度一定不会超过某一上限,至于最快的是单线程还是多线程,和当前测试环境又有很大的关系。换句话说,你们这测试都是白干了啊!
最后回到楼主的问题,你这问题一点意义都没有。线程并不能显著提高文件读写性能,需要提高性能首先要知道性能的瓶颈在什么地方。
20w行文件读取的速度不会比20w行插入数据库更慢。
你的性能要提高顶多是弄个内存缓存区,读取插入各一个线程,文件读取后填入,插入那边只管缓存区是否有数据,这样整体速度取决于最慢的那一方了。