C# 解析巨大的CSV并加载到MySQL数据库
我有一个用C编写的程序,它读取CSV,解析数据,对数据进行一些转换,然后将新处理的数据放入anTix类处理的MySQL数据库。代码如下:C# 解析巨大的CSV并加载到MySQL数据库,c#,mysql,csv,C#,Mysql,Csv,我有一个用C编写的程序,它读取CSV,解析数据,对数据进行一些转换,然后将新处理的数据放入anTix类处理的MySQL数据库。代码如下: int counter = 0; string lineStr; string[] splitStr; anTix active = new anTick();
int counter = 0;
string lineStr;
string[] splitStr;
anTix active = new anTick();
System.IO.StreamReader file;
file = new System.IO.StreamReader(ofd.FileName);
while ( ( lineStr = file.ReadLine() ) != null )
{
counter++;
splitStr = lineStr.Split( ',' );
active.procData( splitStr[0],
splitStr[1] + splitStr[2],
Convert.ToSingle( splitStr[3] ),
Convert.ToInt16( splitStr[4] ),
Convert.ToChar( splitStr[5] ) );
}
file.Close();
这没什么特别的,但它完成了任务,即使是我以前认为的大文件,1.5GB是我处理过的最大的文件。我现在已经升级到25-50GB的大数据文件,而我没有足够的内存来处理这么大的文件
在仔细研究了一下之后,我已经研究了内存映射文件,但是我对进程的效率有一些担心我只在处理文件中的并发进程时使用内存映射文件,从来没有将其作为内存分配的解决方法,我不想为典型的100-200MB文件减慢进程
有没有更简单的方法来处理这个问题的建议?你不能把文件分成一组较小的文件,然后在每个较小的文件上运行你的程序吗?还是有什么东西需要您一次读取整个程序?转换是否依赖于每个给定文件中的所有数据?如果是这样的话,你能再描述一下吗?不,这个文件只是一组要解析并放入数据库的行,不需要对文件进行整体查看。我不明白问题出在哪里。StreamReader.ReadLine一次只加载一行,不使用额外的内存,无论文件是100字节还是100 GB。每行是否有100 GB长?使用StreamReader.Read。active.procData做什么?你没有试图在RAM中使用相同的流,是吗?无论文件大小如何,都不应该这样做。我怀疑问题不在你给我们看的代码中。我同意@DourHighArch的观点-我创建了一个30 GB的垃圾文件,并使用任何额外的内存对每一行进行了处理。还有一些其他的事情在发生,一些你不想看到的参考资料。内存探查器结果?啊哈,我发现了anTix类在处理数据库时保留数据的问题,而不是读取文件的问题。非常感谢你的帮助!拆分文件不会有太大的问题,但我不确定如何做到这一点,而不会像现在将巨型文件加载到内存中一样头疼。有没有快速拆分文件的方法?请尝试unix的“拆分”命令。有一个标志,以确保它不会分裂线分开。刚才看到你正在使用C。你有cygwin吗?这是“分裂”的。