C#文件读写的有关问题,C#调用C++dll的有关问题
C#文件读写的问题,C#调用C++dll的问题
现需要将数据库中的数据按年份取出来写入到文件中,希望数据库中保留的数据不超过1k条,如果取历史数据则直接读取文件即可,写入文件这一块会使用应用程序来做,读取数据则是b/s,希望读取文件并解析的时间不超过1s,每年的数据量有30w+
下面是我做过的测试:
1. BinaryFormatter序列化,30w数据写入文件要10s左右,反序列化时间也差不多,时间太长
2. 遍历数据表,拼接字符串写入文件,写入速度达到要求了,但是读取出并解析耗费时间大概在4s左右,这个速度距离1s以内差的太远了
3. 将数据写入dbf文件,这个不说了,惨不忍睹,时间单位只能用分钟
4. 根据表设计新建结构,每个字段长度固定,取出数据遍历,拼接byte[] 写入文件,写入速度跟拼接字符串写入速度差不多,读取并解析的速度大概在2s-3s左右,距需求还是有点距离
还试过直接序列化DataTable,时间太长;试过遍历拼接json串写入文件,读取时使用json反序列化,结果是数据量过了1w+后程序直接死了
不知道大家有没有什么好的方法能够实现这些需求,或是提供另外一种思路。谢谢!
下面是另一种方式,但是现在遇到问题了:
同事是做C++的,经过他测试,读取数据只需要几十毫秒,他说这个数据读取以后就直接能够使用而不需要转换,因为我不懂C++所以我也不知道他说的这个对不对。
所以现在由他编写一个C++ dll来写入和读取文件, 我来调用即可
写入时候需要传递结构数组,我现在只能传递一个结构过去,不知道数组怎么传递
还有就是读取文件时,他返回一个指针,那我这边应该怎么接收这个数据呢,网上有一些介绍在C#中使用指针的内容,但是看的云里雾里,反而更迷糊了,有没有哪个大牛介绍下这方面的知识
已经做好被喷、被鄙视的准备了,真心希望大牛帮助!我最多只能给100分了!
------解决思路----------------------
从整个设计方案上来看,就十分不合理
难道你觉得直接跟文件打交道,会比跟数据库打交道效率更高吗?
数据库中只保存1K条,这是哪个2B出的主意
那还要数据库干嘛
------解决思路----------------------
返回一个指针当然“快”了。有本事应该获取完整的数据实体本事,而那种给“指针”的性能只说肯定是扯淡、骗你的了!
------解决思路----------------------
尽量使用数据库,不要想着使用文件,如果要保存文件中,请保存为二进形式,千万别想着保存为文本格式,然后来解析,性能会相差N倍,今天下午正好有时间,就做了一个Demo,由于代码量比较多,我就分段贴出来
首先定义我们需要使用到时的实体
下面是保存数据至文件的代码
现需要将数据库中的数据按年份取出来写入到文件中,希望数据库中保留的数据不超过1k条,如果取历史数据则直接读取文件即可,写入文件这一块会使用应用程序来做,读取数据则是b/s,希望读取文件并解析的时间不超过1s,每年的数据量有30w+
下面是我做过的测试:
1. BinaryFormatter序列化,30w数据写入文件要10s左右,反序列化时间也差不多,时间太长
2. 遍历数据表,拼接字符串写入文件,写入速度达到要求了,但是读取出并解析耗费时间大概在4s左右,这个速度距离1s以内差的太远了
3. 将数据写入dbf文件,这个不说了,惨不忍睹,时间单位只能用分钟
4. 根据表设计新建结构,每个字段长度固定,取出数据遍历,拼接byte[] 写入文件,写入速度跟拼接字符串写入速度差不多,读取并解析的速度大概在2s-3s左右,距需求还是有点距离
还试过直接序列化DataTable,时间太长;试过遍历拼接json串写入文件,读取时使用json反序列化,结果是数据量过了1w+后程序直接死了
不知道大家有没有什么好的方法能够实现这些需求,或是提供另外一种思路。谢谢!
下面是另一种方式,但是现在遇到问题了:
同事是做C++的,经过他测试,读取数据只需要几十毫秒,他说这个数据读取以后就直接能够使用而不需要转换,因为我不懂C++所以我也不知道他说的这个对不对。
所以现在由他编写一个C++ dll来写入和读取文件, 我来调用即可
写入时候需要传递结构数组,我现在只能传递一个结构过去,不知道数组怎么传递
还有就是读取文件时,他返回一个指针,那我这边应该怎么接收这个数据呢,网上有一些介绍在C#中使用指针的内容,但是看的云里雾里,反而更迷糊了,有没有哪个大牛介绍下这方面的知识
已经做好被喷、被鄙视的准备了,真心希望大牛帮助!我最多只能给100分了!
------解决思路----------------------
从整个设计方案上来看,就十分不合理
难道你觉得直接跟文件打交道,会比跟数据库打交道效率更高吗?
数据库中只保存1K条,这是哪个2B出的主意
那还要数据库干嘛
------解决思路----------------------
返回一个指针当然“快”了。有本事应该获取完整的数据实体本事,而那种给“指针”的性能只说肯定是扯淡、骗你的了!
------解决思路----------------------
尽量使用数据库,不要想着使用文件,如果要保存文件中,请保存为二进形式,千万别想着保存为文本格式,然后来解析,性能会相差N倍,今天下午正好有时间,就做了一个Demo,由于代码量比较多,我就分段贴出来
首先定义我们需要使用到时的实体
class User
{
public uint UID
{
get;
set;
}
public string UserName
{
get;
set;
}
public string NickName
{
get;
set;
}
}
下面是保存数据至文件的代码
public static void SaveUsers(IList<User> users)
{
using (Stream stream = File.Create(@"d:\sign.db"))
{
foreach (User user in users)
{
byte[] buffer = BitConverter.GetBytes(user.UID);
stream.Write(buffer, 0, buffer.Length);
buffer = Encoding.Default.GetBytes(user.UserName);
int length = buffer.Length;
byte[] data = BitConverter.GetBytes(length);
stream.Write(data, 0, data.Length);
stream.Write(buffer, 0, buffer.Length);
buffer = Encoding.Default.GetBytes(user.NickName);
length = buffer.Length;
data = BitConverter.GetBytes(length);
stream.Write(data, 0, data.Length);
stream.Write(buffer, 0, buffer.Length);
}
}