【问题标题】:how to avoid high cpu usage when reading large files读取大文件时如何避免高cpu使用率
【发布时间】:2015-02-28 19:45:03
【问题描述】:

我的项目使用 BackgroundThread 将字符串的休长列表加载到列表视图中,它的性能非常快,但占用了近 100% 的 cpu 是否有任何解决方法可以在不降低其性能的情况下避免高 cpu 使用率?我使用网络框架 3.5

代码:

        void readfile() {

        deg_readfile read = new deg_readfile(readfileasync);
        read.BeginInvoke(new AsyncCallback(callback),null);
    }

    void readfileasync(){
        string[] strs = File.ReadAllLines("hughlist.txt");
        List<ListViewItem> _itemlst = new List<ListViewItem>();
        ListViewItem _item;
        int x = 0;
        //problem start here
        foreach (string str in strs) {
            _item = new ListViewItem(str);

            for (int i = 0; i < 6; i++) {
                _item.SubItems.Add("");              
            }              
            _itemlst.Add(_item);
            x++;
            _item = null;
        }
    }

    void callback(IAsyncResult ae) {
        Console.WriteLine("finished");

    }

    delegate void deg_readfile();

    static void Main(string[] args)
    {
        Program prog = new Program();

        Thread t=new Thread(new ThreadStart(prog.readfile))
        {
            IsBackground = true,
            Priority = ThreadPriority.Lowest

        };
        t.SetApartmentState(ApartmentState.MTA);
        t.Start();
        Console.Read();

    }

提前致谢。

更新:

系统配置:

处理器:Intel(R) Core(TM) i3-2328M CPU @ 2.20GHZ 2.11 GHZ 安装内存:1.00 GB 系统类型:32位操作系统

文件大小为 35,939 KB,包含 100 万行

【问题讨论】:

  • 您的系统配置是什么,您有多少个逻辑处理器? CPU 保持 100% 多长时间?文件有多大,它包含多少行?
  • @SriramSakthivel 我不认为文件的大小很重要,重要的是它很大:),但是 mysticgirltk ,请写下你的系统配置,你的操作系统、操作系统和 CPU 的架构是什么、内存大小和 CPU 时钟时间
  • @niceman 巨大是一个广义的术语。巨大有多大?你能回答这个问题吗?可能不是。所以为了避免混淆,我询问了文件大小。
  • @SriramSakthivel ,也是 niceman ,感谢您的回复,我已经更新了问题,文件大小为 35,939 kb,我有 intel i core 3

标签: c# listview asynchronous foreach large-data


【解决方案1】:

这不是异步的:您只是使用不同的线程来调用调用,并且传递的委托将在主(GUI)线程中同步运行(因为控件与创建它们的线程相关联:主线程) .

所以工作线程做了两件事:

  • 创建线程
  • 线程池线程上的调用操作

它已经完成了。

线程池线程完成所有工作,包括同步读取文件。2

但是,单个文件 IO 不太可能1花费大量时间;然后在第一次运行之后,它将被缓存在内存中,从而减少 IO 以调度内核调用的时间。

但异步执行操作不会减少所需的 CPU 资源量(有可能——设置数据结构来跟踪事物——需要更多):你的 CPU 将参与处理文件的内容。

您也许可以对其进行优化,但您需要从探查器数据开始了解 CPU 时间花费在哪里。


1如果文件存在于具有高延迟或低带宽连接的网络共享上,则可能会有所不同。

2 严格来说,在线程池线程上执行阻塞操作是一种糟糕的形式(它们不可用于其他活动),但不太可能成为文件 IO 的问题。 (参见上一个脚注。)

【讨论】:

  • 你错了。 read.BeginInvokeDelegate.BeginInvoke 而不是 Control.BeginInvoke,因此代码不会在 UI 线程中执行,而是在 ThreadPool 中执行。
  • @SriramSakthivel 哎呀,是的。但这没有任何区别:如果它是 CPU 限制的,它仍然是 CPU 限制的。
猜你喜欢
  • 2014-03-23
  • 2020-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
  • 2020-11-12
  • 2018-03-27
  • 1970-01-01
相关资源
最近更新 更多