先放到内存,然后后台开线程去写文件,或者先写入文件流,最后统一将流保存为文件,io效率最低,最好不要频繁的进行io读写
解决方案 »
- Win32Exception (0x80004005): 拒绝访问。
- 动态生成是什么意思
- 我现在想作个压力测试
- 怎样在一个网页中实现按下一个按钮,在下面添加一个控件 急,在线等
- MSDN WebBrowser控件的一段示例代码, 有个疑问请大家帮忙
- 如何把datatable 转换成list??
- datagridview问题,急,在线等
- 菜鸟问题,如何将现有的数据生成一个XML文件?在线等!
- 老问题了,有点着急了,大家帮忙啊!!!!谢谢谢谢谢谢啦!!!!!!!!!!
- C# 图片不规则截取(截取范围非矩形)
- C#调用java写的webservice,在GetResponse()取得对方返回值时报500内部服务器错误
- 请问大家关于C# Winform 弹出窗口的问题???(解决给分)
byte[] bytes = new byte[ADData.Length * sizeof(double)];
Buffer.BlockCopy(ADData, 0, bytes, 0, ADData.Length * sizeof(double));
你说的每秒就会存储一次的意思是在数组里面的数据要在1秒钟全部存到disk? 然后清空,接受新的数据重复上面的1秒存储操作?
但是每次File.AppendAllText会打开并关闭文件,开销很大。建议你采用二进制输出,并采用文件流(利用已有的缓存机制)。using (FileStream fs = new FileStream("filename", FileMode.Create, FileAccess.Write))
using (BinaryWriter writer = new BinaryWriter(fs))
{
for (int i = 0; i < ADData.Length; i++)
{
writer.Write(ADData[i]);
}
}
你说的每秒就会存储一次的意思是在数组里面的数据要在1秒钟全部存到disk? 然后清空,接受新的数据重复上面的1秒存储操作? 之前确实是这样想的 现在在用
using (StreamWriter sw = new StreamWriter("E:\\Zz222.txt", true, System.Text.Encoding.Default))
{
for (int i = 0; i < Class1.classdatacount1; i++)
{
sw.Write(data2[i].ToString()); }
}
这个方法 发现貌似可以 数组也拆成一维数组了。不过新问题是 常常会报 System.OutOfMemoryException”的异常
发现有时需要new int [4943872]这么长的数组..再想办法解决这个了 请教大虾有什么高招么
CreateFile, WriteFile, CloseHandle
发现有时需要new int [4943872]这么长的数组..再想办法解决这个了 请教大虾有什么高招么
抛出第一个exception是因为你的内存不够用,也就是说你需要解决的是减小内存开销。
第二个问题,我觉得得看你的需求到底是什么,是不是有必要new一个这么大的数组,要知道你这么做对于内存来说很不值得,性能上也不可接受,对于你的问题里面提到的IO操作是比较费时的,我猜测你new这么大的数组无非是要存储一些数据进去,然后将这些数据永久化(存储到硬盘,数据库等等),那么为何需要一次性new int呢(new byte是不是也可以满足需求呢)? 可以说说你的需求到底是什么吗?
public class ThreadTest
{
private ReaderWriterLockSlim l = new ReaderWriterLockSlim(); public void Write(object obj)
{
List<object> lst = obj as List<object>;
FileStream fs = lst[0] as FileStream;
long offset = (long)lst[1];
long count = (long)lst[2];
byte[] data = lst[3] as byte[]; l.EnterWriteLock();
try
{
using (fs)
{
fs.Seek(offset, SeekOrigin.Begin);
for (long i = offset; i < count; i++)
{
fs.WriteByte(data[i]);
}
}
}
finally
{
l.ExitWriteLock();
}
}
} class Program
{
static byte[] GetBytes(string str)
{
byte[] bytes = new byte[str.Length * sizeof(char)];
System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
} static void Main(string[] args)
{
// 模拟100W double数据
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000000; i++)
{
double num = new Random().NextDouble();
sb.Append(num);
} ThreadTest test = new ThreadTest();
//string str = "1234567891011121314151617181920212223242526272829303132";
byte[] data = GetBytes(sb.ToString());
int threadCount = 10;
long count = data.Length / threadCount;
for (long offset = 0; offset < data.Length; offset = count)
{
count += offset;
if (count > data.Length)
{
count = data.Length;
}
FileStream fs = new FileStream("Test.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
List<object> lst = new List<object>();
lst.Add(fs); lst.Add(offset); lst.Add(count); lst.Add(data);
new Thread(new ParameterizedThreadStart(test.Write)).Start(lst);
}
}
}其中的threadCount就是你需要启用的线程数,这些线程就是用来异步的写入数据到文件中,分段的写入数据(Seek方法)。
File.AppendAllText("E:\\a.txt",String.Join("\r\n", ADData.Select(d=>d.ToString());要对内存操作和IO操作的效率数量级有清楚的认识。