先放到内存,然后后台开线程去写文件,或者先写入文件流,最后统一将流保存为文件,io效率最低,最好不要频繁的进行io读写

解决方案 »

  1.   

    先转成字节数组,再写入二进制文件            double[] ADData = new double[2000000];
                byte[] bytes = new byte[ADData.Length * sizeof(double)];
                Buffer.BlockCopy(ADData, 0, bytes, 0, ADData.Length * sizeof(double));
      

  2.   


    你说的每秒就会存储一次的意思是在数组里面的数据要在1秒钟全部存到disk? 然后清空,接受新的数据重复上面的1秒存储操作? 
      

  3.   

    200000个double,每个double8个字节,为1.6兆/秒。硬盘本身应该没有问题。
    但是每次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]);
        }
    }
      

  4.   

    我的天,appendtext这是最慢的方式。还ToString()。应该直接写二进制文件。
      

  5.   


    你说的每秒就会存储一次的意思是在数组里面的数据要在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]这么长的数组..再想办法解决这个了  请教大虾有什么高招么
      

  6.   

    这么大量的数据写入文件,时间全部浪费在循环语句上了,建议楼主使用 WINDOWS API 写文件
    CreateFile, WriteFile, CloseHandle 
      

  7.   

    不过新问题是 常常会报 System.OutOfMemoryException”的异常
    发现有时需要new int [4943872]这么长的数组..再想办法解决这个了  请教大虾有什么高招么 
    抛出第一个exception是因为你的内存不够用,也就是说你需要解决的是减小内存开销。
    第二个问题,我觉得得看你的需求到底是什么,是不是有必要new一个这么大的数组,要知道你这么做对于内存来说很不值得,性能上也不可接受,对于你的问题里面提到的IO操作是比较费时的,我猜测你new这么大的数组无非是要存储一些数据进去,然后将这些数据永久化(存储到硬盘,数据库等等),那么为何需要一次性new int呢(new byte是不是也可以满足需求呢)? 可以说说你的需求到底是什么吗?
      

  8.   

    还有,你并不能保证每次都能在1秒钟之内存储这么多数据到disk中去,所以你的思路可能要改变一下,否则你的数组没秒刷新会造成数据丢死或者脏数据的。
      

  9.   

    另外你用多线程IO试一下,就是说用多个stream实例操作一个文件(这里用到了锁的机制),我写了一个例子,你测试一下看看能不能达到你的要求。
        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方法)。
      

  10.   

    在内存中一次组装完成整个字符串,再写文件:
    File.AppendAllText("E:\\a.txt",String.Join("\r\n", ADData.Select(d=>d.ToString());要对内存操作和IO操作的效率数量级有清楚的认识。