目錄
LINQ-to-SQL中的数据缓存与应对
一个线程单例的数据上下文的提出:
首頁 資料庫 mysql教程 LINQ-to-SQL那点事~LINQ-to-SQL中的数据缓存与应对

LINQ-to-SQL那点事~LINQ-to-SQL中的数据缓存与应对

Jun 07, 2016 pm 03:14 PM
因應 數據 快取

回到目录 这个文章写的有点滞后了,呵呵,因为总想把之前不确定的东西确定了之后,再写这篇,之前的LINQ-to-SQL那点事,请点这里。 LINQ-to-SQL中的数据缓存与应对 Linq-to-SQL它是微软自己推出的一个轻量级的ORM框架,它很好地完成了与SQLSERVER数据库的映

回到目录

这个文章写的有点滞后了,呵呵,因为总想把之前不确定的东西确定了之后,再写这篇,之前的LINQ-to-SQL那点事,请点这里。

LINQ-to-SQL中的数据缓存与应对

Linq-to-SQL它是微软自己推出的一个轻量级的ORM框架,它很好地完成了与SQLSERVER数据库的映射(它目前只支持SQLSERVER,也不会有以后的,因为微软不对它进行更新了),在使用它时,微软提出了“数据上下文”的概念,这个上下文(context)类似于HttpContext,RequestContext,是指对某种事物的完整的抽象,把对这种事物的操作都集成在上下文中。

Linq-to-SQL的上下文被称为DataContext,它进一步的封装了SQL语句,亮点在于它的查询上,支持延时查询,再配合linq的语法,使得开发人员在写代码时很优雅,代码表现力更强。

DataContext在性能方面提出了缓存的概念,它可以装查询出来的数据缓存到上下文中(这有时会产生并发问题),对于Insert,Update,Delete这类执行类操作也提供了缓存语句,每当SubmitChange方法被触发时,这时缓存的语句被一次性的提交到SQLSERVER,之后将当前上下文的缓存语句清空。

一个线程单例的数据上下文的提出:

当你希望把延时的数据返回到表示层时,DataContext如果被dispose之后,这种操作是不被允许的,这是正确的,因为你的数据上下文可能在表示层方法执行前已经被dispose了,一般这种代码会被这样书写:

    <span style="color: #0000ff;">public</span> IQueryable<order_info> GetOrder_Info(Expression<func style="color: #0000ff;">bool>><span style="color: #000000;"> predicate)
        {
            </span><span style="color: #0000ff;">using</span> (<span style="color: #0000ff;">var</span> datacontext = <span style="color: #0000ff;">new</span><span style="color: #000000;"> LinqDataContext())
            {
                </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> datacontext.Where(predicate);
            }
        }</span></func></order_info>
登入後複製

这段代码在执行上当然是有问题的,使用了using关键字后,在方法return这数据上下文DataContext将会被dispose,这是正常的,而由于linq语句返回的是IQueryable延时结果集,它将不会立即执行,只有真正返回数据时才会通过DataContext与SQLSERVER进行交互,而在上层方法中,由于DataContext这时已经被dispose了,所以,语句最终会报异常。

面对这种问题,我们知道了它的原因,所以接下来就寻找一种解决方法,即不叫DataContext立即dispose的方法,你可能会很容易的想到“把using去掉不就可以了”,事实上,如果你对linq to sql了解的话,这种做法是不可取的,因为这样,你在业务逻辑层无法实现“复杂查询,linq join”(一般地,我们为每个DAL层的表对象写几个方法,可能是根据条件去查询数据的方法),为什么呢?因为,对于一个linq查询语句来说,你的数据上下文必须是同一个才行,如果用户业务使用一个上下文,而订单业务使用另一个上下文,那么,这两个业务进行组成查询时,就会出现不同数据上下文的问题。

代码可能是这样:

   <span style="color: #0000ff;">var</span> linq =<span style="color: #0000ff;">from</span> user <span style="color: #0000ff;">in</span><span style="color: #000000;"> userBLL().GetModel()
             join order </span><span style="color: #0000ff;">in</span><span style="color: #000000;"> orderBLL().GetModel() on user.UserID equals order.UserID
              </span><span style="color: #0000ff;">select</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> user_Ext<br>                {
                  ...
                }</span>
登入後複製

为数据上下文添加一个工厂,用来生成由UI线程产生的数据上下文,再把这些上下文放在一个由UI线程作为键的字典里,当UI线程中的数据上下文在进行SubmitChange出现异常进,我们再将当然上下文dispose,并从数据上下文字典中移除它。

数据上下文工厂及数据上下文基类代码如下:

    <span style="color: #808080;">///</span> <span style="color: #808080;"><summary></summary></span>
    <span style="color: #808080;">///</span><span style="color: #008000;"> 数据库建立工厂
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Created By : 张占岭
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Created Date:2011-10-14
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Modify By:
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Modify Date:
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Modify Reason:
    </span><span style="color: #808080;">///</span> <span style="color: #808080;"></span>
    <span style="color: #0000ff;">internal</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> DbFactory
    {
        </span><span style="color: #0000ff;">#region</span> Fields
        <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">readonly</span> <span style="color: #0000ff;">string</span> strConn = System.Configuration.ConfigurationManager.ConnectionStrings[<span style="color: #800000;">"</span><span style="color: #800000;">test</span><span style="color: #800000;">"</span><span style="color: #000000;">].ToString();
        </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> System.Timers.Timer sysTimer;
        </span><span style="color: #0000ff;">volatile</span> <span style="color: #0000ff;">static</span> Dictionary<thread datacontext><span style="color: #000000;"> divDataContext;
        </span><span style="color: #0000ff;">#endregion</span>

        <span style="color: #0000ff;">#region</span> Constructors
        <span style="color: #0000ff;">static</span><span style="color: #000000;"> DbFactory()
        {
            divDataContext </span>= <span style="color: #0000ff;">new</span> Dictionary<thread datacontext><span style="color: #000000;">();
            sysTimer </span>= <span style="color: #0000ff;">new</span> System.Timers.Timer(<span style="color: #800080;">10000</span><span style="color: #000000;">);
            sysTimer.AutoReset </span>= <span style="color: #0000ff;">true</span><span style="color: #000000;">;
            sysTimer.Enabled </span>= <span style="color: #0000ff;">true</span><span style="color: #000000;">;
            sysTimer.Elapsed </span>+= <span style="color: #0000ff;">new</span><span style="color: #000000;"> System.Timers.ElapsedEventHandler(sysTimer_Elapsed);
            sysTimer.Start();
        }
        </span><span style="color: #0000ff;">#endregion</span>

        <span style="color: #0000ff;">#region</span> Private Methods
        <span style="color: #808080;">///</span> <span style="color: #808080;"><summary></summary></span>
        <span style="color: #808080;">///</span><span style="color: #008000;"> 清理DbContext上下文
        </span><span style="color: #808080;">///</span> <span style="color: #808080;"></span>
        <span style="color: #808080;">///</span> <span style="color: #808080;"><param name="sender"></span>
        <span style="color: #808080;">///</span> <span style="color: #808080;"><param name="e"></span>
        <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> sysTimer_Elapsed(<span style="color: #0000ff;">object</span><span style="color: #000000;"> sender, System.Timers.ElapsedEventArgs e)
        {
            List</span><thread> list =<span style="color: #000000;"> divDataContext.Keys
                                              .Where(item </span>=> item.ThreadState ==<span style="color: #000000;"> ThreadState.Stopped)
                                              .ToList();
            </span><span style="color: #0000ff;">if</span> (list != <span style="color: #0000ff;">null</span> && list.Count > <span style="color: #800080;">0</span><span style="color: #000000;">)
            {
                </span><span style="color: #0000ff;">foreach</span> (<span style="color: #0000ff;">var</span> thread <span style="color: #0000ff;">in</span><span style="color: #000000;"> list)
                {
                    </span><span style="color: #0000ff;">foreach</span> (<span style="color: #0000ff;">var</span> context <span style="color: #0000ff;">in</span><span style="color: #000000;"> divDataContext[thread])
                    {
                        </span><span style="color: #0000ff;">if</span> (context != <span style="color: #0000ff;">null</span><span style="color: #000000;">)
                            context.Dispose();
                    }
                }
            }
        }
        </span><span style="color: #0000ff;">#endregion</span>

        <span style="color: #0000ff;">#region</span> Public Methods
        <span style="color: #808080;">///</span> <span style="color: #808080;"><summary></summary></span>
        <span style="color: #808080;">///</span><span style="color: #008000;"> 通过工厂的制造模式获取相应的LINQ数据库连接对象
        </span><span style="color: #808080;">///</span> <span style="color: #808080;"></span>
        <span style="color: #808080;">///</span> <span style="color: #808080;"><param name="dbName"></span><span style="color: #008000;">数据库名称(需要与真实数据库名称保持一致)</span><span style="color: #808080;"></span>
        <span style="color: #808080;">///</span> <span style="color: #808080;"><returns></returns></span><span style="color: #008000;">LINQ数据库连接对象</span><span style="color: #808080;"></span>
        <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> DataContext Intance(<span style="color: #0000ff;">string</span><span style="color: #000000;"> dbName)
        {
            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Intance(dbName, Thread.CurrentThread);
        }

        </span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></summary></span>
        <span style="color: #808080;">///</span><span style="color: #008000;"> 通过工厂的制造模式获取相应的LINQ数据库连接对象
        </span><span style="color: #808080;">///</span> <span style="color: #808080;"></span>
        <span style="color: #808080;">///</span> <span style="color: #808080;"><param name="dbName"></span><span style="color: #008000;">数据库名称(需要与真实数据库名称保持一致)</span><span style="color: #808080;"></span>
        <span style="color: #808080;">///</span> <span style="color: #808080;"><param name="thread"></span><span style="color: #008000;">当前线程引用的对象</span><span style="color: #808080;"></span>
        <span style="color: #808080;">///</span> <span style="color: #808080;"><returns></returns></span><span style="color: #008000;">LINQ数据库连接对象</span><span style="color: #808080;"></span>
        <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> DataContext Intance(<span style="color: #0000ff;">string</span><span style="color: #000000;"> dbName, Thread thread)
        {

            </span><span style="color: #0000ff;">if</span> (!<span style="color: #000000;">divDataContext.Keys.Contains(thread))
            {
                divDataContext.Add(thread, </span><span style="color: #0000ff;">new</span> DataContext[<span style="color: #800080;">3</span><span style="color: #000000;">]);
            }

            </span><span style="color: #0000ff;">if</span> (dbName.Equals(<span style="color: #800000;">"</span><span style="color: #800000;">test</span><span style="color: #800000;">"</span><span style="color: #000000;">))
            {
                </span><span style="color: #0000ff;">if</span> (divDataContext[thread][<span style="color: #800080;">0</span>] == <span style="color: #0000ff;">null</span><span style="color: #000000;">)
                {
                    divDataContext[thread][</span><span style="color: #800080;">0</span>] = <span style="color: #0000ff;">new</span><span style="color: #000000;"> DAL.dbDataContext(strConn);
                }
                </span><span style="color: #0000ff;">return</span> divDataContext[thread][<span style="color: #800080;">0</span><span style="color: #000000;">];
            }

</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">null</span><span style="color: #000000;">;

        }

        </span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></summary></span>
        <span style="color: #808080;">///</span><span style="color: #008000;"> 手动清除数据上下文,根据线程
        </span><span style="color: #808080;">///</span> <span style="color: #808080;"></span>
        <span style="color: #808080;">///</span> <span style="color: #808080;"><param name="thread"></span>
        <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> ClearContextByThread(Thread thread, DataContext db)
        {
            divDataContext.Remove(thread);</span><span style="color: #008000;">//</span><span style="color: #008000;">从线程字典中移除</span>
            db.Dispose();<span style="color: #008000;">//</span><span style="color: #008000;">释放数据资源</span>
<span style="color: #000000;">        }
        </span><span style="color: #0000ff;">#endregion</span><span style="color: #000000;">

    }</span></thread></thread></thread>
登入後複製

 

下面是DataContext基类,已经对SubmitChanges(SaveChanges)方法进行了优化,手动dispose上下文。

<span style="color: #808080;">///</span> <span style="color: #808080;"><summary></summary></span>
    <span style="color: #808080;">///</span><span style="color: #008000;"> Repository基类
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> 所有linqTosql上下文对象都继承它
    </span><span style="color: #808080;">///</span> <span style="color: #808080;"></span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">abstract</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> ContextBase
    {
        </span><span style="color: #0000ff;">protected</span> DataContext _db { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">set</span><span style="color: #000000;">; }
        </span><span style="color: #0000ff;">protected</span> IUnitOfWork UnitOfWork { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">set</span><span style="color: #000000;">; }
        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> ContextBase(DataContext db)
        {
            _db </span>=<span style="color: #000000;"> db;
            UnitOfWork </span>=<span style="color: #000000;"> (IUnitOfWork)db;
        }
        </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> SaveChanges()
        {
            ChangeSet cSet </span>=<span style="color: #000000;"> _db.GetChangeSet();
            </span><span style="color: #0000ff;">if</span> ((cSet.Inserts.Count > <span style="color: #800080;">0</span>
                || cSet.Updates.Count > <span style="color: #800080;">0</span>
                || cSet.Deletes.Count > <span style="color: #800080;">0</span><span style="color: #000000;">)
                </span>&& !<span style="color: #000000;">UnitOfWork.IsNotSubmit)
            {
                </span><span style="color: #0000ff;">try</span><span style="color: #000000;">
                {
                    UnitOfWork.SaveChanges();
                }
                </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (System.Data.Linq.ChangeConflictException)
                {
                    </span><span style="color: #0000ff;">foreach</span> (System.Data.Linq.ObjectChangeConflict occ <span style="color: #0000ff;">in</span><span style="color: #000000;"> _db.ChangeConflicts)
                    {
                        </span><span style="color: #008000;">//</span><span style="color: #008000;"> 使用当前数据库中的值,覆盖Linq缓存中实体对象的值  </span>
<span style="color: #000000;">                        occ.Resolve(System.Data.Linq.RefreshMode.OverwriteCurrentValues);
                        </span><span style="color: #008000;">//</span><span style="color: #008000;"> 使用Linq缓存中实体对象的值,覆盖当前数据库中的值  </span>
<span style="color: #000000;">                        occ.Resolve(System.Data.Linq.RefreshMode.KeepCurrentValues);
                        </span><span style="color: #008000;">//</span><span style="color: #008000;"> 只更新实体对象中改变的字段的值,其他的保留不变  </span>
<span style="color: #000000;">                        occ.Resolve(System.Data.Linq.RefreshMode.KeepChanges);
                    }
                    UnitOfWork.SaveChanges();
                }
              </span><span style="color: #0000ff;">catch</span> (Exception)<span style="color: #008000;">//</span><span style="color: #008000;">如果出现异常,就从数据字典中清除这个键值对</span>
<span style="color: #000000;">                {
                    DbFactory.ClearContextByThread(System.Threading.Thread.CurrentThread, _db);
              }
            }
        }
    }</span>
登入後複製

下面是一个领域的repository基类,代码如下:

    <span style="color: #808080;">///</span> <span style="color: #808080;"><summary></summary></span>
    <span style="color: #808080;">///</span><span style="color: #008000;"> Test数据库基类
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Created By : 张占岭
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Created Date:2011-10-14
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Modify By:
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Modify Date:
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Modify Reason:
    </span><span style="color: #808080;">///</span> <span style="color: #808080;"></span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">abstract</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> TestBase : ContextBase
    {
        </span><span style="color: #0000ff;">#region</span> Constructors
        <span style="color: #0000ff;">public</span><span style="color: #000000;"> EEE114Base()
            : </span><span style="color: #0000ff;">this</span>(<span style="color: #0000ff;">null</span><span style="color: #000000;">)
        { }

        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> EEE114Base(IUnitOfWork db)
            : </span><span style="color: #0000ff;">base</span>((DataContext)db ?? DbFactory.Intance(<span style="color: #800000;">"</span><span style="color: #800000;">test</span><span style="color: #800000;">"</span><span style="color: #000000;">, Thread.CurrentThread))
        { }
        </span><span style="color: #0000ff;">#endregion</span>

        <span style="color: #0000ff;">#region</span> Protected Properies
        <span style="color: #808080;">///</span> <span style="color: #808080;"><summary></summary></span>
        <span style="color: #808080;">///</span><span style="color: #008000;"> 可以使用的数据库连接对象
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> [xxb]
        </span><span style="color: #808080;">///</span> <span style="color: #808080;"></span>
        <span style="color: #0000ff;">protected</span><span style="color: #000000;"> dbDataContext db
        {
            </span><span style="color: #0000ff;">get</span><span style="color: #000000;">
            {
                </span><span style="color: #0000ff;">return</span> (dbDataContext)<span style="color: #0000ff;">base</span><span style="color: #000000;">._db;
            }
        }

        </span><span style="color: #0000ff;">#endregion</span><span style="color: #000000;">
 }
}</span>
登入後複製

OK,这就是改善之后的linq to sql架构的核心代码,主要体现在生成数据上下文对象上,及如何去避免并发冲突的产生,而对于并发冲突我们会在另一篇文章中做详细的说明。敬请期待!

回到目录

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

使用ddrescue在Linux上恢復數據 使用ddrescue在Linux上恢復數據 Mar 20, 2024 pm 01:37 PM

DDREASE是一種用於從檔案或區塊裝置(如硬碟、SSD、RAM磁碟、CD、DVD和USB儲存裝置)復原資料的工具。它將資料從一個區塊設備複製到另一個區塊設備,留下損壞的資料區塊,只移動好的資料區塊。 ddreasue是一種強大的恢復工具,完全自動化,因為它在恢復操作期間不需要任何干擾。此外,由於有了ddasue地圖文件,它可以隨時停止和恢復。 DDREASE的其他主要功能如下:它不會覆寫恢復的數據,但會在迭代恢復的情況下填補空白。但是,如果指示工具明確執行此操作,則可以將其截斷。將資料從多個檔案或區塊還原到單

開源!超越ZoeDepth! DepthFM:快速且精確的單目深度估計! 開源!超越ZoeDepth! DepthFM:快速且精確的單目深度估計! Apr 03, 2024 pm 12:04 PM

0.這篇文章乾了啥?提出了DepthFM:一個多功能且快速的最先進的生成式單目深度估計模型。除了傳統的深度估計任務外,DepthFM還展示了在深度修復等下游任務中的最先進能力。 DepthFM效率高,可以在少數推理步驟內合成深度圖。以下一起來閱讀這項工作~1.論文資訊標題:DepthFM:FastMonocularDepthEstimationwithFlowMatching作者:MingGui,JohannesS.Fischer,UlrichPrestel,PingchuanMa,Dmytr

Google狂喜:JAX性能超越Pytorch、TensorFlow!或成GPU推理訓練最快選擇 Google狂喜:JAX性能超越Pytorch、TensorFlow!或成GPU推理訓練最快選擇 Apr 01, 2024 pm 07:46 PM

谷歌力推的JAX在最近的基準測試中表現已經超過Pytorch和TensorFlow,7項指標排名第一。而且測試並不是JAX性能表現最好的TPU上完成的。雖然現在在開發者中,Pytorch依然比Tensorflow更受歡迎。但未來,也許有更多的大型模型會基於JAX平台進行訓練和運行。模型最近,Keras團隊為三個後端(TensorFlow、JAX、PyTorch)與原生PyTorch實作以及搭配TensorFlow的Keras2進行了基準測試。首先,他們為生成式和非生成式人工智慧任務選擇了一組主流

iPhone上的蜂窩數據網路速度慢:修復 iPhone上的蜂窩數據網路速度慢:修復 May 03, 2024 pm 09:01 PM

在iPhone上面臨滯後,緩慢的行動數據連線?通常,手機上蜂窩互聯網的強度取決於幾個因素,例如區域、蜂窩網絡類型、漫遊類型等。您可以採取一些措施來獲得更快、更可靠的蜂窩網路連線。修復1–強制重啟iPhone有時,強制重啟設備只會重置許多內容,包括蜂窩網路連線。步驟1–只需按一次音量調高鍵並放開即可。接下來,按降低音量鍵並再次釋放它。步驟2–過程的下一部分是按住右側的按鈕。讓iPhone完成重啟。啟用蜂窩數據並檢查網路速度。再次檢查修復2–更改資料模式雖然5G提供了更好的網路速度,但在訊號較弱

特斯拉機器人進廠打工,馬斯克:手的自由度今年將達到22個! 特斯拉機器人進廠打工,馬斯克:手的自由度今年將達到22個! May 06, 2024 pm 04:13 PM

特斯拉機器人Optimus最新影片出爐,已經可以在工廠裡打工了。正常速度下,它分揀電池(特斯拉的4680電池)是這樣的:官方還放出了20倍速下的樣子——在小小的「工位」上,揀啊揀啊揀:這次放出的影片亮點之一在於Optimus在廠子裡完成這項工作,是完全自主的,全程沒有人為的干預。而且在Optimus的視角之下,它還可以把放歪了的電池重新撿起來放置,主打一個自動糾錯:對於Optimus的手,英偉達科學家JimFan給出了高度的評價:Optimus的手是全球五指機器人裡最靈巧的之一。它的手不僅有觸覺

超級智能體生命力覺醒!可自我更新的AI來了,媽媽再也不用擔心資料瓶頸難題 超級智能體生命力覺醒!可自我更新的AI來了,媽媽再也不用擔心資料瓶頸難題 Apr 29, 2024 pm 06:55 PM

哭死啊,全球狂煉大模型,一網路的資料不夠用,根本不夠用。訓練模型搞得跟《飢餓遊戲》似的,全球AI研究者,都在苦惱怎麼才能餵飽這群資料大胃王。尤其在多模態任務中,這問題尤其突出。一籌莫展之際,來自人大系的初創團隊,用自家的新模型,率先在國內把「模型生成數據自己餵自己」變成了現實。而且還是理解側和生成側雙管齊下,兩側都能產生高品質、多模態的新數據,對模型本身進行數據反哺。模型是啥?中關村論壇上剛露面的多模態大模型Awaker1.0。團隊是誰?智子引擎。由人大高瓴人工智慧學院博士生高一鑷創立,高

阿里7B多模態文件理解大模型拿下新SOTA 阿里7B多模態文件理解大模型拿下新SOTA Apr 02, 2024 am 11:31 AM

多模態文件理解能力新SOTA!阿里mPLUG團隊發布最新開源工作mPLUG-DocOwl1.5,針對高解析度圖片文字辨識、通用文件結構理解、指令遵循、外部知識引入四大挑戰,提出了一系列解決方案。話不多說,先來看效果。複雜結構的圖表一鍵識別轉換為Markdown格式:不同樣式的圖表都可以:更細節的文字識別和定位也能輕鬆搞定:還能對文檔理解給出詳細解釋:要知道,“文檔理解”目前是大語言模型實現落地的一個重要場景,市面上有許多輔助文檔閱讀的產品,有的主要透過OCR系統進行文字識別,配合LLM進行文字理

美國空軍高調展示首個AI戰鬥機!部長親自試駕全程未乾預,10萬行代碼試飛21次 美國空軍高調展示首個AI戰鬥機!部長親自試駕全程未乾預,10萬行代碼試飛21次 May 07, 2024 pm 05:00 PM

最近,軍事圈被這個消息刷屏了:美軍的戰鬥機,已經能由AI完成全自動空戰了。是的,就在最近,美軍的AI戰鬥機首次公開,揭開了神秘面紗。這架戰鬥機的全名是可變穩定性飛行模擬器測試飛機(VISTA),由美空軍部長親自搭乘,模擬了一對一的空戰。 5月2日,美國空軍部長FrankKendall在Edwards空軍基地駕駛X-62AVISTA升空注意,在一小時的飛行中,所有飛行動作都由AI自主完成! Kendall表示——在過去的幾十年中,我們一直在思考自主空對空作戰的無限潛力,但它始終顯得遙不可及。然而如今,

See all articles