none
每秒不停会有n个数据写入同一个路径指向的sqlite数据文件,当文件的大小达到一定程度时,暂停写入,等待更换文件后再写入。如何设计? RRS feed

  • 问题

  • 已知每秒都可能都会有n个数据,调用同一个方法异步写入同一个路径下指向的sqlite的db文件,当db文件的大小达到指定大小时,暂停数据写入,将数据写入到缓存集合中,同时更换路径指向的文件,复制模板db文件到制到指向的路径里,文件更换后,开启写入,同时将缓存里的数据也写入到集合里。该db文件已经设置了允许多个线程进行insert操作。

    例如 配置文件大小写入上限是100k,文件路径是d:\log\log.db,当d:\log\log.db所指向的文件大小超过100k时,暂停数据插入,将之后发送过来的数据写入到缓存集合中,将d:\log\log.db所指向的文件改名或剪切到其他地方,将模板db文件复制到d:\log\log.db这个位置。在开启允许写入操作

     

    请问上述功能的实现类要怎么设计?要求该类的写入文件的方法暴露给外部的,只有insert方法以及它的重载。

    补充一下设计逻辑

    从一开始的时候,就只有一个模板文件,逻辑是这样的 "若指定路径的文件存在则(d:\log\1.db)->不断的异步写入->超过限定大小时->写入数据方向转入到缓存里,把该文件改名(以当前日期或其他的),或者剪切到其他目录->在复制模板文件到同样的路径(d:\log\1.db)->复制完成,写入数据方向转向文件,同时将缓存里的数据写入文件中"。对于我来说。难点就是最后两个步骤的逻辑要怎么设计的好,怎样做到不出问题异常。





    2020年3月31日 12:11

全部回复

  • Hi,

    根据你的描述,我设计了下面的类。其中filelist表示的是需要写入的文件list,我建议你用File.AppendText来写入文件,这样每次剩下来的就是totalline减去cuurentline,设置filesize来限制文件大小,如果超出了,就跳出当前循环,不再写入那个文件。如果想写入下一个文件,就重新使用insert方法。

      public class WriteData
        {
            public List<string> filelist = new List<string>();
    
            public List<string> totalline = new List<string>();
    
            public List<string> leftline = new List<string>();
    
            public int FileSize { get; set; }
    
            public FileInfo file { get; set; }
           public void Insert(string filename)
            {
                foreach (var item in totalline)
                {
                    file = new FileInfo(filename);
                    if(file.Length>FileSize)
                    {
                        break;
                    }
                    else
                    {
                        File.AppendAllText(filename, item);
                    }
                
                }
            }
        
        
        }

    希望我的代码以及解释能帮助你。

    Best Regards,

    Jack


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2020年4月1日 8:25
    版主
  • Hi,

    根据你的描述,我设计了下面的类。其中filelist表示的是需要写入的文件list,我建议你用File.AppendText来写入文件,这样每次剩下来的就是totalline减去cuurentline,设置filesize来限制文件大小,如果超出了,就跳出当前循环,不再写入那个文件。如果想写入下一个文件,就重新使用insert方法。

      public class WriteData
        {
            public List<string> filelist = new List<string>();
    
            public List<string> totalline = new List<string>();
    
            public List<string> leftline = new List<string>();
    
            public int FileSize { get; set; }
    
            public FileInfo file { get; set; }
           public void Insert(string filename)
            {
                foreach (var item in totalline)
                {
                    file = new FileInfo(filename);
                    if(file.Length>FileSize)
                    {
                        break;
                    }
                    else
                    {
                        File.AppendAllText(filename, item);
                    }
                
                }
            }
        
        
        }

    希望我的代码以及解释能帮助你。

    Best Regards,

    Jack


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    你可能对问题理解的不太对,我的策略中,没有要求文件列表这个字段存在。我说一下逻辑吧

    从一开始的时候,就只有一个模板文件,逻辑是这样的 "若指定路径的文件存在则(d:\log\1.db)->不断的异步写入->超过限定大小时->写入数据方向转入到缓存里,把该文件改名(以当前日期或其他的),或者剪切到其他目录->在复制模板文件到同样的路径(d:\log\1.db)->复制完成,写入数据方向转向文件,同时将缓存里的数据写入文件中"。对于我来说。难点就是最后两个步骤的逻辑要怎么设计的好,怎样做到不出问题。

    2020年4月1日 10:25
  • Hi,

    感谢您的反馈。

    我知道您的要求中没有文件列表这个字段存在,我设置这个字段的目的是为了添加其他文件时需要用的。

    >在复制模板文件到同样的路径(d:\log\1.db

    这个你可以在log目录下动态创建文件,例如用i代替文件名,1.db就是第一个文件,2.db就是第二个,依次类推。

    >复制完成,写入数据方向转向文件,同时将缓存里的数据写入文件中

    这个就像我上面写的那个方法判断是否文件大小抄过一定的size,如果超过就停止写入。然后再次调用insert方法,这样就能保证讲剩下来的写入新的文件中。

    Best Regards,

    Jack


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2020年4月2日 9:14
    版主