dataset 订阅
DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据库,DataSet是不依赖于数据库的独立数据集合。所谓独立,就是说,即使断开数据链路,或者关闭数据库,DataSet依然是可用的,DataSet在内部是用XML来描述数据的,由于XML是一种与平台无关、与语言无关的数据描述语言,而且可以描述复杂关系的数据,比如父子关系的数据,所以DataSet实际上可以容纳具有复杂关系的数据,而且不再依赖于数据库链路。 展开全文
DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据库,DataSet是不依赖于数据库的独立数据集合。所谓独立,就是说,即使断开数据链路,或者关闭数据库,DataSet依然是可用的,DataSet在内部是用XML来描述数据的,由于XML是一种与平台无关、与语言无关的数据描述语言,而且可以描述复杂关系的数据,比如父子关系的数据,所以DataSet实际上可以容纳具有复杂关系的数据,而且不再依赖于数据库链路。
信息
应用领域
数据库
概    述
DataSet是ADO.NET的中心概念
特    点
独立性、离线
优    势
处理脱机数据等
中文名
DataSet
实    质
DataTable物件集合
DataSet概述
DataSet 是 ADO. NET结构的主要组件,它是从数据源中检索到的数据在内存中的缓存。DataSet 由一组 DataTable 对象组成,可使这些对象与 DataRelation 对象互相关联。还可通过使用 UniqueConstraint 和 ForeignKeyConstraint 对象在 DataSet 中实施数据完整性。 [1]  正是由于DataSet才使得程序员在编程时可以屏蔽数据库之间的差异,从而获得一致的编程模型。DataSet支持多表、表间关系、数据约束等,和关系数据库的模型基本一致。ado.net DataSet 的设计已明确指出它可独立于任何资料来源外而存取资料。因此,它可与多个不同的资料里来源搭配使用、与 XML 资料搭配使用,或用于管理应用程序的本机资料。DataSet 包含一或多个由资料列和资料行所组成的DataTable物件集合,以及 DataTable 物件中的主索引键、外部索引键、条件约束 (Constraint) 及资料的相关资讯。尽管 DataTable 对象中包含数据,但是 DataRelationCollection 允许遍览表的层次结构。这些表包含在通过 Tables 属性访问的 DataTableCollection 中。当访问 DataTable 对象时,请注意它们是按条件区分大小写的。例如,如果一个 DataTable 被命名为“mydatatable”,另一个被命名为“Mydatatable”,则用于搜索其中一个表的字符串被认为是区分大小写的。但是,如果“mydatatable”存在而“Mydatatable”不存在,则认为该搜索字符串不区分大小写。 [1]  DataSet 可将数据和架构作为 XML 文档进行读写。数据和架构可通过 HTTP 传输,并在支持 XML 的任何平台上被任何应用程序使用。可使用 WriteXmlSchema 方法将架构保存为 XML 架构,并且可以使用 WriteXml 方法保存架构和数据。若要读取既包含架构也包含数据的 XML 文档,可使用 ReadXml 方法。在典型的多层实现中,用于创建和刷新 DataSet 并依次更新原始数据的步骤包括:通过 DataAdapter 使用数据源中的数据生成和填充 DataSet 中的每个 DataTable。通过添加、更新或删除 DataRow 对象更改单个 DataTable 对象中的数据。调用 GetChanges 方法以创建只反映对数据进行的更改的第二个 DataSet。调用 DataAdapter 的 Update 方法,并将第二个 DataSet 作为参数传递。调用 Merge 方法将第二个 DataSet 中的更改合并到第一个中。针对 DataSet 调用 AcceptChanges。或者,调用 RejectChanges 以取消更改。需要注意的是:dataset所有数据都加载在内存上执行的,可以提高数据访问速度,提高硬盘数据的安全性。极大的改善了程序运行的速度和稳定性。 [1] 
收起全文
精华内容
参与话题
问答
  • DataSet是什么,怎么用

    千次阅读 2019-07-16 19:26:45
    什么是DataSetDataSet是分布式的数据集合。DataSet是在Spark1.6中添加的新的接口。它集中了RDD的优点(强类型和可以用强大lambda函数)以及Spark SQL优化的执行引擎。DataSet可以通过JVM的对象进行构建,可以用...

    什么是DataSet?
    DataSet是分布式的数据集合。DataSet是在Spark1.6中添加的新的接口。它集中了RDD的优点(强类型和可以用强大lambda函数)以及Spark SQL优化的执行引擎。DataSet可以通过JVM的对象进行构建,可以用函数式的转换(map/flatmap/filter)进行多种操作。

    DataFrame、DataSet、RDD的区别

    假设RDD中的两行数据长这样:
    在这里插入图片描述
    那么DataFrame中的数据长这样:

    那么Dataset中的数据长这样: 在这里插入图片描述
    或者长这样(每行数据是个Object):
    在这里插入图片描述

    DataSet包含了DataFrame的功能,Spark2.0中两者统一,DataFrame表示为DataSet[Row],即DataSet的子集。
    (1)DataSet可以在编译时检查类型
    (2)并且是面向对象的编程接口
    相比DataFrame,Dataset提供了编译时类型检查,对于分布式程序来讲,提交一次作业太费劲了(要编译、打包、上传、运行),到提交到集群运行时才发现错误,这会浪费大量的时间,这也是引入Dataset的一个重要原因。

    DataFrame与DataSet的互转
    DataFrame和DataSet可以相互转化。
    (1)DataFrame转为 DataSet
    df.as[ElementType]这样可以把DataFrame转化为DataSet。
    (2)DataSet转为DataFrame
    ds.toDF()这样可以把DataSet转化为DataFrame。

    创建DataSet

    (1)通过spark.createDataset创建

    //todo:1、创建SparkSession,指定appName和master
    val spark: SparkSession = SparkSession.builder()
      .appName("SparkSqlSchema")
      .master("local[2]")
      .getOrCreate()
    //需要导入隐式装换
    import spark.implicits._
    //创建dataframe的方式1
    val ds: Dataset[Int] = spark.createDataset(0 to 10)
    ds.show()
    spark.stop()
    

    (2)通toDS方法生成DataSet

    //todo:1、创建SparkSession,指定appName和master
    val spark: SparkSession = SparkSession.builder()
      .appName("SparkSqlSchema")
      .master("local[2]")
      .getOrCreate()
    //需要导入隐式装换
    import spark.implicits._
    val df = spark.createDataFrame(List(Person01("Jason", 34), Person01("Tom", 20)))
    val ds: Dataset[Person01] = df.as[Person01]
    ds.show()
    spark.stop()
    

    (3)通过List封装数据直接转换成dataSet

    //todo:1、创建SparkSession,指定appName和master
    val spark: SparkSession = SparkSession.builder()
      .appName("SparkSqlSchema")
      .master("local[2]")
      .getOrCreate()
    import spark.implicits._
    //需要导入隐式装换
    val ds = List(Person("Jason", 34), Person("Tom", 20)).toDS()
    ds.show();
    
    展开全文
  • DataSet用法详细

    万次阅读 2018-08-23 08:49:45
    DataSet用法详细 一、特点介绍 1、处理脱机数据,在多层应用程序中很有用。 2、可以在任何时候查看DataSet中任意行的内容,允许修改查询结果的方法。 3、处理分级数据 4、缓存更改 5、XML的完整性:DataSet...

    DataSet用法详细

    一、特点介绍

    1、处理脱机数据,在多层应用程序中很有用。

    2、可以在任何时候查看DataSet中任意行的内容,允许修改查询结果的方法。

    3、处理分级数据

    4、缓存更改

    5、XML的完整性:DataSet对象和XML文档几乎是可互换的。

    二、使用介绍

    1、创建DataSet对象:

    DataSetds = new DataSet("DataSetName");

    2、查看调用SqlDataAdapter.Fill创建的结构

    da.Fill(ds,"Orders");

    DataTabletbl = ds.Table[0];

    foreach(DataColumncol in tbl.Columns)

    Console.WriteLine(col.ColumnName);

    3、查看SqlDataAdapter返回的数据

    ①DataRow对象

    DataTabletbl = ds.Table[0];

    DataRowrow = tbl.Row[0];

    Console.WriteLine(ros["OrderID"]);

    ②检查存储在DataRow中的数据

    DataTabletbl = row.Table;

    foreach(DataColumncol in tbl.Columns)

    Console.WriteLine(row[col]);

    ③检查DatTable中的DataRow对象

    foreach(DataRowrow in tbl.Rows)

    DisplayRow(row);

    4、校验DataSet中的数据

    ①校验DataColumn的属性:ReadOnly,AllowDBNull,MaxLength,Unique

    ②DataTable对象的Constrains集合:UiqueConstraints,Primarykey,ForeignkeyConstraints

    通常不必刻意去创建ForeignkeyConstraints,因为当在DataSet的两个DataTable对象之间创建关系时会创建一个。

    ③用SqlDataAdapter.Fill模式来检索模式信息

    5、编写代码创建DataTable对象

    ①创建DataTable对象:

    DataTabletbl = new DataTable("TableName");

    ②将DataTable添加到DataSet对象的Table集合

    DataSetds = new DataSet();

    DataTabletbl = new DataTable("Customers");

    ds.Tables.Add(tbl);

    DataSetds = new DataSet();

    DataTabletbl = ds.Tables.Add("Customers");

    DataTable对象只能存在于至多一个DataSet对象中。如果希望将DataTable添加到多个DataSet中,就必须使用Copy方 法或Clone方法。Copy方法创建一个与原DataTable结构相同并且包含相同行的新DataTable;Clone方法创建一个与原 DataTable结构相同,但没有包含任何行的新DataTable。

    ③为DataTable添加列

    DataTabletbl = ds.Tables.Add("Orders");

    DataColumncol =tbl.Columns.Add("OrderID",typeof(int));

    col.AllowDBNull= false;

    col.MaxLength= 5;

    col.Unique= true;

    tbl.PrimaryKey= new DataColumn[]{tbl.Columns["CustomersID"]};

    当设置主键时,AllowDBNull自动设置为False;

    ④处理自动增量列

    DataSetds = new DataSet();

    DataTabletbl = ds.Tables.Add("Orders");

    DataColumncol = tbl.Columns.Add("OrderID",typeof(int));

    col.AutoIncrement= true;

    col.AutoIncrementSeed= -1;

    col.AutoIncrementStep= -1;

    col.ReadOnly= true;

    ⑤添加基于表达式的列

    tbl.Columns.Add("ItemTotal",typeof(Decimal),"Quantity*UnitPrice");

    6、修改DataTable内容

    ①添加新DataRow

    DataRowrow = ds.Tables["Customers"].NewRow();

    row["CustomerID"]= "ALFKI";

    ds.Tables["Customers"].Rows.Add(row);

    object[]aValues={"ALFKI","Alfreds","Anders","030-22222"};

    da.Tables["Customers"].LoadDataRow(aValues,false);

    ②修改当前行

    修改行的内容逼供内不会自动修改数据库中相应的内容,对行所做的修改被视为是随后将使用SqlDataAdapter对象来提交交给数据库的待定的更改。

    DataRowrowCustomer;

    rowCustomer= ds.Tables["Custoemrs"].Rows.Find("ANTON");

    if(rowCustomer== null)

        //没有查找客户

    else

    {

        rowCustomer["CompanyName"]="NewCompanyName";

        rowCustomer["ContactName"]="NewContactName";

    }

     

    //推荐使用这种方式

    DataRowrowCustomer;

    rowCustomer= ds.Tables["Custoemrs"].Rows.Find("ANTON");

    if(rowCustomer== null)

        //没有查找客户

    else

    {

        rowCustomer.BeginEdit();

        rowCustomer["CompanyName"]="NewCompanyName";

        rowCustomer["ContactName"]="NewContactName";

        rowCustomer.EndEdit();

    }

    //null表示不修改该列的数据

    obejct[]aCustomer ={null,"NewCompanyName","NewContactName",null}

    DataRowrowCustomer;

    rowCustomer= ds.Tables["Customers"].Rows.Find("ALFKI");

    rowCustomer.ItemArray= aCustomer;

    ③处理DataRow的空值

    //查看是否为空

    DataRowrowCustomer;

    rowCustomer= ds.Tables["Customers"].Rows.Find("ALFKI");

    if(rowCustomer.IsNull("Phone"))

    Console.WriteLine("It''''sNull");

    else

    Console.WriteLine("It''''snot Null");

     

    //赋予空值

    rowCustomer["Phone"]= DBNull.Value;

    ④删除DataRow

    DataRowrowCustomer;

    rowCustomer= ds.Tables["Customers"].Rows.Find("ALFKI");

    rowCustomer.Delete();

    ⑤清除DataRow

    DataRowrowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");

    rowCustomer.ItemArray= aCustomer;

    da.Tables["Customers"].Remove(rowCustomer);

    或者

    ds.Tables["Customers"].RemoveAt(intIndex);

    ⑥使用DataRow.RowState属性 :Unchanged,Detached,Added,Modified,Deleted

    privatevoid DemonstrateRowState()

    {

        // Run a function to create a DataTablewith one column.

        DataTable myTable = MakeTable();

        DataRow myRow;

        // Create a new DataRow.

        myRow = myTable.NewRow();

        // Detached row.

        Console.WriteLine("New Row " +myRow.RowState);

        myTable.Rows.Add(myRow);

        // New row.

        Console.WriteLine("AddRow " +myRow.RowState);

        myTable.AcceptChanges();

        // Unchanged row.

        Console.WriteLine("AcceptChanges" + myRow.RowState);

        myRow["FirstName"] ="Scott";

        // Modified row.

        Console.WriteLine("Modified " +myRow.RowState);

        myRow.Delete();

        // Deleted row.

        Console.WriteLine("Deleted " +myRow.RowState);

    }

    ⑦检查DataRow中的挂起更改

    DataRowrowCustomer;

    rowCustomer= ds.Tables["Customers"].Rows.Find("ALFKI");

    rowCustomer["CompanyName"]= "NewCompanyName";

    stringstrNewCompanyName,strOldCompanyName;

    Console.WriteLine(rowCustomer["CompanyName",DataRowVersion.Current]);

    Console.WriteLine(rowCustomer["CompanyName",DataRowVersion.Original]);

    ⑧遍历DataSet

    foreach(DataTabledt in dataSet.Tables)

    foreach(DataRowdr in dt.Rows)

    foreach(DataColumndc in dr.Table.Columns)

    Console.WriteLine(dr[dc]);

    三、属性方法事件介绍

    1、DataSet

    ①属性

    CaseSensitive:用于控制DataTable中的字符串比较是否区分大小写。

    DataSetName:当前DataSet的名称。如果不指定,则该属性值设置为"NewDataSet"。如果将DataSet内容写入XML文件,DataSetName是XML文件的根节点名称。

    DesignMode:如果在设计时使用组件中的DataSet,DesignMode返回True,否则返回False。

    HasErrors:表示DataSet中 的DataRow对象是否包含错误。如果将一批更改提交给数据库并将DataAdapter对象的ContinueUpdateOnError属性设置为 True,则在提交更改后必须检查DataSet的HasErrors属性,以确定是否有更新失败。

    NameSpace和Prefix:指定XML命名空间和前缀

    Relations:返回一个DataRelationCollection对象。

    Tables:检查现有的DataTable对象。通过索引访问DataTable有更好的性能。

    ②方法

    AcceptChanges和RejectChanges: 接受或放弃DataSet中所有挂起更改。调用AcceptChanges时,RowState属性值为Added或Modified的所有行的 RowState属性都将被设置为UnChanged.任何标记为Deleted的DataRow对象将从DataSet中删除。调用 RejectChanges时,任何标记为Added的DataRow对象将会被从DataSet中删除,其他修改过的DatRow对象将返回前一状态。

    Clear:清除DataSet中所有DataRow对象。该方法比释放一个DataSet然后再创建一个相同结构的新DataSet要快。

    Clone和Copy:使用Copy方法会创建与原DataSet具有相同结构和相同行的新DataSet。使用Clone方法会创建具有相同结构的新DataSet,但不包含任何行。

    GetChanges:返回与原DataSet对象具有相同结构的新DataSet,并且还包含原DataSet中所有挂起更改的行。

    GetXml和GetXmlSchema:使用GetXml方法得到由DataSet的内容与她的架构信息转换为XML格式后的字符串。如果只希望返回架构信息,可以使用GetXmlSchema。

    HasChange:表示DataSet中是否包含挂起更改的DataRow对象。

    Merge:从另一个DataSet、DataTable或现有DataSet中的一组DataRow对象载入数据。

    ReadXml和WriteXml:使用ReadXml方法从文件、TextReader、数据流或者XmlReader中将XML数据载入DataSet中。

    Reset:将DataSet返回为未初始化状态。如果想放弃现有DataSet并且开始处理新的DataSet,使用Reset方法比创建一个DataSet的新实例好。

    ③事件

    MergeFailed:在DataSet的Merge方法发生一个异常时触发。

    2、DataTable

    ①属性

    ②方法

    ③事件

    ColumnChanged:在列的内容被改变之后触发

    ColumnChangding:在列的内容被改变之前触发

    RowChanged,RowChanging,RowDeleted,RowDeleting

    3、DataColumn

    ①属性

    4、DataRow

    ①属性

    HasError:确定行是否包含错误。

    Item:通过指定行的列数,列的名称或DataColumn对象本身,访问列的内容。

    ItemArray:获取或设置行中所有列的值。

    RowError:返回一个包含行错误信息的字符串。

    RowState:返回DataRowState枚举中的值来表示行的当前状态。

    Table:返回DataRow对象所在的DataTable。

    ②方法

    AcceptChanges和RejectChanges:提交和放弃挂起更改。

    BeginEdit、CancelEdit、EndEdit

    ClearErrors:清除DataRow中所有的错误。

    Delete:Delete方法实际上并不从DataRow表的Row集合中删除该DataRow。当调用DataRow对象的Delete方法时,ADO.NET将该行标记为删除,之后调用SqlDataAdapter对象的Update方法来删除其在数据库中对应的行。

    如果希望彻底删除DataRow,可以调用Delete方法,接着再调用它的AccepteChanges方法,还可以使用DataRowCollection对象的Remove方法完成相同的任务。

    datasetds =new datast();

    datatabletel =new datatable();

    ds..tables.add(tel);

    stringcode=ds.tables["tel"].rows[0][0].tostring();

     

     

    浅谈DataSet 的用法

    DataSet 是ADO.NET开发人员为方便数据处理开发出来的,是数据的集合,是为解决DataReader的缺陷设计的,DataReader数据处理速度快,但 它是只读的,而且一旦移到下一行,就不能查看上一行的数据,DataSet则可以自由移动指针。DataSet的数据是与数据库断开的。DataSet 还可用于多层应用程序中,如果应用程序运行在中间层的业务对象中来访问数据库,则业务对象需将脱机数据结构传递给客户应用程序。

    DataSet的功能:浏览、排序、搜索、过滤、处理分级数据、缓存更改等。还可以与XML数据互换。DataSet中可包括多个 DataTable,可将多个查询结构存到一个DataSet中,方便操作,而DataTable中又包括多个DataRow、DataColumn,可 通过这些 DataRow、DataColumn来查看、操作其中的数据,而需将操作结果返回给数据库的话,则可以调用DataAdapter的Update方法。

    DataSet的操作:

    DataSetds=new DataSet();

    DataTabledt=new DataTable("newTable");

    ds.Tables.Add(dt);

    DataSetds=new DataSet();

    DataTabledt=ds.Tables.Add("newTable");

    上述两种方法都可以在DataSet中添加一个DataTable,看需要而进行选择。添加DataTable后,需向其中添加行和列。

    DataSetds=new DataSet();

    DataTabledt=ds.Tables.Add("newTables");

    DataColumncol=dt.Columns.Add("newColumn",typeof(int));

    col.AllowDBNull=false;

    col.MaxLength=4;

    col.Unique=true;

    上述代码向DataSet中的DataTable中添加名为”newColumn”,类型为int且不为空,最大长度为4和唯一性为真的列。

    dt.PrimaryKey=newDataColumn[]{dt.Columns["ID"]}

    这段代码是继续上面代码的,为一个DataTable中添加一个主键列,主键列是一个数据组,如有多个主键,只需在数组中添加一个列即可。如下:

    dt.PrimaryKey=newDataColumns[]{dt.Columns["OrderID"],dt.Columns["ProductID"]}

    添加外键:

    ForeignKeyConstraintfk;

    fk=newForeignKeyConstraint(ds.Tables["Customers"].Columns["CustomerID"],ds.Tables["Orders"].Columns["CustomerID"]);

    ds.Tables["Orders"].Constraints.Add(fk);

    上述代码假如已经为Cusomers表和Orders创建了主键,此句为添加外键约束。

    上述是根据Customers表和Orders表的CustomerID来创建约束。

    下面介绍修改DataRow中的内容:

    DataRowdr=ds.Tables["Customer"].Rows.Find("ANTON");

    if(dr==null)

    else

    {

        dr.BeginEdit();

        dr["CompanyName"]="newValue";

        dr["ContactName"]="newValue2";

        dr.EndEdit();

    }

    上面代码通过Row集合的Find方法来在DataTable中的行进行定位,找到"ANTON"行,再修改"ANTON"行中 CompanyName列和ContactName列的值。通过BeginEdit和EndEdit来缓存对行的修改,还可调用 CancelEdit为取消修改。

    判断某列是否为空值:

    DataRowdr=ds.Tables["Customers"].Rows.Find("aaa");

    if(dr.IsNull("ContactName");

        ..

    else

        dr["ContactName"]=DBNull.Value

    这里判断ContactName列是否为空,如果不是则为其赋空值,呵,很无厘头的做法,这里只为演示为列赋空值的做法。

    删除DataRow:

    有两种方法可以删除DataRow,Delete方法和Remove方法和RemoveAt方法。其区别是Delete方法实际上不是从 DataTable 中删除掉一行,而是将其标志为删除,仅仅是做个记号,而Remove方法则是真正的从DataRow中删除一行,RemoveAt方法是根本行的索引来删 除。列:

    DataRowdr=ds.Tables["table"].Rows.Find("a");

    ds.Tables["table"].Remove(dr);

    ds.Tables["table"].Remove(index);

    dr 为"a"所在的行,查出后将其删除,index为 "a"所在的索引号。关于DataSet中的其用法,参照MSDN

    DataRowdr=ds.Tables["Customers"].Rows.Find("aaa");

    if(dr.IsNull("ContactName");

        ..

    else

        dr["ContactName"]=DBNull.Value

    这里判断ContactName列是否为空,如果不是则为其赋空值,呵,很无厘头的做法,这里只为演示为列赋空值的做法。

    usingSystem.Data;

    usingSystem;

    usingSystem.Windows.Forms;

    classDataT

    {

        static DataTable dt;// = new DataTable();

        static DataSet ds;

        static void method1()

        {

            dt = new DataTable("Name");

            ds = new DataSet();

            dt.Columns.Add(newDataColumn("ID", typeof(Int32)));

            dt.Columns.Add(newDataColumn("Name", typeof(string)));

            dt.Columns.Add(newDataColumn("Sex", typeof(string)));

            dt.Columns.Add(newDataColumn("Addr", typeof(string)));

        }

        static void add(int id,string name,stringsex,string addr)

        {

            DataRow dr = dt.NewRow();

            dr["id"] = id;

            dr["Name"] = name;

            dr["Sex"] = sex;

            dr["Addr"] = addr;

            dt.Rows.Add(dr);

        }

        static void Main()

        {

            DataT DT = new DataT();

            method1();

            add(100,"Join","Male","北京");

            add(101,"Lily","feMale","北京");

            add(102,"JIM","Male","北京");

            ds.Tables.Add(dt);

            foreach(DataRow dr in dt.Rows)

            {

                MessageBox.Show(dr["ID"].ToString()+ " " + dr["Name"].ToString() + " " +dr["Sex"].ToString() + " " +dr["Addr"].ToString(),"Message");

                Console.WriteLine(dr["ID"].ToString()+ " " + dr["Name"].ToString()+ " " +dr["Sex"].ToString() + " " +dr["Addr"].ToString());

            }

            Try

            {

                foreach(DataTable dt2 in ds.Tables)

                foreach(DataRow dr in dt2.Rows)

                Console.WriteLine(dr["ID"].ToString()+ " " + dr["Name"].ToString() + " " + dr["Sex"].ToString()+ " " + dr["Addr"].ToString());

            }

            catch(Exception ex)

            {

                Console.WriteLine("dkfjksdjfk");

            }

        }

    }

    展开全文
  • C#中DataSet的用法(很详细)

    热门讨论 2010-10-15 13:56:25
    DataSet是ADO.NET开发人员为方便数据处理开发出来的,是数据的集合。DataSet的功能:浏览、排序、搜索、过滤、处理分级数据、缓存更改等。还可以与XML数据互换。DataSet中可包括多个DataTable,可将多个查询结构...
  • Dataset

    千次阅读 2019-02-22 10:25:52
    Dataset 只负责数据的抽象,一次只返回一个数据或者样本 Pytorch中数据集被抽象为一个抽象类torch.utils.data.Dataset,所有的数据集都应该继承这个类,并override以下两项:    __len__:代表样本数量。len...

    Dataset                只负责数据的抽象,一次只返回一个数据或者样本

    Pytorch中数据集被抽象为一个抽象类torch.utils.data.Dataset,所有的数据集都应该继承这个类,并override以下两项:

     

        __len__:代表样本数量。len(obj)等价于obj.__len__()。

        __getitem__:返回一条数据或一个样本。obj[index]等价于obj.__getitem__。建议将节奏的图片等高负载的操作放到这里,因为多进程时会并行调用这个函数,这样做可以加速。

     

    dataset中应尽量只包含只读对象,避免修改任何可变对象。因为如果使用多进程,可变对象要加锁,但后面讲到的dataloader的设计使其难以加锁。如下面例子中的self.num可能在多进程下出问题:

     

    class BadDataset(Dataset):

     def __init__(self):

      self.datas = range(100)

      self.num = 0 # read data times

     def __getitem__(self, index):

      self.num += 1

      return self.datas[index]

     

     

    Dataloader  前面提到过,在训练神经网络时,最好是对一个batch的数据进行操作,同时还需要对数据进行shuffle和并行加速等。对此,PyTorch提供了DataLoader帮助我们实现这些功能。

     

    官方documentation

     

    Dataset负责表示数据集,它可以每次使用__getitem__返回一个样本。而torch.utils.data.Dataloader提供了对batch的处理,如shuffle等。Dataset被封装在了Dataloader中。

     

    Dataloader的构造函数如下:

     

    class torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=False, sampler=None,

     batch_sampler=None, num_workers=0, collate_fn=<function default_collate>, 

     pin_memory=False, drop_last=False, timeout=0, worker_init_fn=None)

     

      

     

    部分参数解释如下:

     

        num_workers:使用的子进程数,0为不使用多进程。

            worker_init_fn: 默认为None,如果不是None,这个函数将被每个子进程以子进程id([0, num_workers - 1]之间的数)调用

        sample:采样策略,若这个参数有定义,则shuffle必须为False

        pin_memory:是否将tensor数据复制到CUDA pinned memory中,pin memory中的数据转到GPU中会快一些

        drop_last:当dataset中的数据数量不能整除batch size时,是否把最后$\text{len(dataset)} \bmod \text{batch_size} $个数据丢掉

        collate_fn:把一组samples打包成一个mini-batch的函数。可以自定义这个函数以处理损坏数据的情况(先在__getitem__函数中将这样的数据返回None,然后再在collate_fn中处理,如丢掉损坏数据or再从数据集里随机挑一张),但最好还是确保dataset里所有数据都能用。

     

    另外,Dataloader是个iterable,可以进行相关迭代操作。

    DataLoaderIter

     

    Dataset、Dataloader和DataLoaderIter是层层封装的关系,最终在内部使用DataLoaderIter进行迭代。

     

     

    https://blog.csdn.net/TH_NUM/article/details/80877687

    4 Tensor向量化数据库

    内存数据需要转为Tensor才能使用,pytorch提供了TensorDataset类可以直接对Tensor数据进行数据库封装  当x和y是pytorch的tensor时,可以方便地导入;另一个ConcatDataset,用于合并多个数据集(对于实际应用特别有用   

     

     

    train_set = torch.utils.data.TensorDataset(train_features, train_labels)
    展开全文
  • js中的dataset问题

    千次阅读 2018-08-17 16:07:14
    1.html5自定义属性及基础 html5中我们可以使用data-前缀... &lt;a href="javascript:;" data-id="...这里的data-前缀就被称为data属性,其可以通过脚本进行定义,也可以应用css属性选择器进行样式设置....

    1.html5自定义属性及基础

    html5中我们可以使用data-前缀设置我们需要的自定义属性,来进行一些数据的存放,例如我们要在一个文字按钮上存放相应的id:

    <a href="javascript:;" data-id="2312">测试</a>
    •  

    这里的data-前缀就被称为data属性,其可以通过脚本进行定义,也可以应用css属性选择器进行样式设置.数量不受限制,在控制和渲染数据的时候提供了非常强大的控制. 
    下面是元素应用data属性的一个例子:

    <div id="day-meal-expense" data-drink="tea" data-food="noodle" data-meal="lunch">$18.3</div>
    •  

    要想获取某个属性的值,可以像下面这样使用dataset对象:

     var expenseday=document.getElementById('day-meal-expense');
     var typeOfDrink=expenseday.dataset.drink;
     console.log(typeOfDrink);//tea
     console.log(expenseday.dataset.food);//noodle
     console.log(expenseday.dataset.meal);//lunch

    如果浏览器支持dataset,则会弹出注释内容,如果浏览器不支持dataset则会报错,无法获取属性drink/food/meal的值:对象为null或未定义(如IE9版本). 
    data属性基本上所有的浏览器都是支持的,但是dataset对象支持的就比较特殊了,目前仅在Opera 11.1+,Chrome 9+下可以通过javascript,使用dataset访问你自定义的data属性.至于其他浏览器,FireFox 6+(未出)以及Safari 6+(未出)会支持dataset对象,至于IE浏览器,目前看来还是遥遥无期的趋势. 
    需要注意的是带边字符连接的名称在使用的时候需要命名驼峰化,即大小写组合书写,这与应用元素的style对象类似,dom.style.borderColor.例如,上面的例子中现有如下data属性,data-meal-time,则我们要获取相应的值可以使用:expenseday.dataset.mealTime.

    2. 为何要使用dataset 
    如果使用传统的方法获取属性值应该会类似下面:

    var typeOfDrink=document.getElementById('day-meal-expense').getAttribute('data-drink');
    •  

    现在,如果我们要获得多个自定义的属性值,就要用下面N行代码来实现了:

    var attrs=expenseday.attributes, expense={},i,j;
    for (i=0,j=attrs.length;i<j;i++){
      if(attrs[i].name.substring(0,5)=='data-'){
        expense[attrs[i].name.substring(5)]=attrs[i].value;
      }
    }

    而使用dataset属性,我们根本不需要任何循环去获取你想要的那个值,直接一行秒杀:

    expense=document.getElementById('day-meal-expense').dataset;
    •  

    dataset并不是典型意义上的JavaScript对象,而是个DOMStringMap对象,DOMStringMap是HTML5一种新的含有多个名-值对的交互变量.

    3. dataset的操作: 
    可以像下面这样操作名-值对:

    charInput=[];
      for(var item in expenseday){
        charInput.push(expenseday[item]);
      }

    上面这几千代码的作用是让所有的自定义属性塞到一个数组中. 
    如果你想删除一个data属性,可以这么做:

    delete expenseday.dataset.meal;
      console.log(expenseday.dataset.meal)//undefined

    如果你想给元素添加一个属性,可以这么做:

    expenseday.dataset.dessert='icecream';
      console.log(expenseday.dataset.dessert);//icecream

    4.跟getAttribute相比的速度 
    同样是获取属性值,使用dataset操作data要比使用getAttribute稍微慢些. 
    但是,如果我们只是处理少量的data数据,这种速度上的差异造成的影响是基本上没有的.反而,我们应该看到,使用dataset操作自适应属性要比其他类似getAttribute的形式要少很多让人头疼的麻烦,并且更具有可读性.因此,权衡来看,操作自定义属性,dataset操作是上选.

    5.什么地方使用dataset

    每次你使用自定义data属性的时候,使用dataset去获取名-值对就是个不错的选择.考虑到现在很多浏览器还是把dataset当作不认识的外星生物看待,所以,在实际使用的时候,有必要进行一下特征检测,看看是否支持dataset,类似下面的使用:

    if(expenseday.dataset){
        expenseday.dataset.dessert='icecream';
      }else{
        expenseday.setAttribute('data-dessert','icecream');
      }

    注意:如果你的应用程序会频繁更新data属性,建议使用JavaScript对象进行数据管理,而不是每次都经由data属性进行更新.

    展开全文
  • dataset和data set的区别

    千次阅读 2019-03-11 15:58:01
    dataset和data set的区别区别结论 参考网站:https://english.stackexchange.com/questions/2120/which-is-correct-dataset-or-data-set?answertab=active#tab-top 区别 在写英语论文的时候会遇到“数据集”这一词语...
  • dataset

    千次阅读 2012-08-21 11:29:49
    这一篇博文收集自己要用到得数据库,持续更新,  Ranking: 【1】MovieLens Data Sets http://www.grouplens.org/node/12 【2】Yahoo! Learning to Rank Challenge ...【3】LETOR: Learni
  • Dataset的用法简析

    万次阅读 2018-02-24 22:40:51
    之前的文章,稍微讲了一下Estimator的用法,也提到Estimator的数据处理使用的是tf.data这两个模块是Tensorflow初学者必须掌握的内容。现在,就让我们从大的概念入手,来慢慢理解tf.data的用法 ...
  • Pytorch(五)入门:DataLoaderDataset

    万次阅读 多人点赞 2018-09-22 09:57:55
    DataLoaderDataset 构建模型的基本方法,我们了解了。 接下来,我们就要弄明白怎么对数据进行预处理,然后加载数据,我们以前手动加载数据的方式,在数据量小的时候,并没有太大问题,但是到了大数据量,我们...
  • PyTorch 入门实战(三)——DatasetDataLoader

    万次阅读 多人点赞 2019-01-16 15:31:45
    关于Pytorch中dataset的迭代问题(这就是为什么我们要使用dataloader的原因) PyTorch入门实战 1.博客:PyTorch 入门实战(一)——Tensor 2.博客:PyTorch 入门实战(二)——Variable 3.博客:PyTorch 入门...
  • pytorch Dataset, DataLoader产生自定义的训练数据

    万次阅读 多人点赞 2019-03-08 13:42:12
    pytorch Dataset, DataLoader产生自定义的训练数据 目录 pytorch Dataset, DataLoader产生自定义的训练数据 1. torch.utils.data.Dataset 2. torch.utils.data.DataLoader 3. 使用Dataset, DataLoader产生...
  • pytorch - 数据读取机制中的DataloaderDataset

    千次阅读 多人点赞 2019-10-21 14:18:27
    1、人民币二分类 要求:将第四套人民币中的一元和一百元进行二分类; 怎么建立一个预测模型呢?考虑上一个博客中的机器学习模型训练五大步骤;第一是数据,第二是模型,第三是损失函数,第四是优化器,第五个是迭代...
  • 前言:在深度学习中,数据的预处理是第一步,pytorch提供了非常规范的处理接口,本文将针对处理过程中的一些问题来进行说明,本文所针对的主要数据是图像数据集。 本文的案例来源于车道线语义分割,采用的数据集是...
  • 从代码角度学习理解Pytorch学习框架04: Dataset类和DataLoader类了解,方便我们加载和处理数据。   # coding=utf-8 import matplotlib as mpl mpl.use('tkagg') # 调试:agg; 运行: tkagg import matplotlib....
  • Pytorch自定义DatasetDataLoader去除不存在和空的数据 【源码GitHub地址】:https://github.com/PanJinquan/pytorch-learning-tutorials/tree/master/image_classification/utils 觉得可以,麻烦给个”Star“ ...
  • 简介 最近都是看图像里边的语义分割部分内容,比较有趣...数据导入,本来Pytorch就有好几个类进行实现,分别是 DataSet, DataLoader, DataLoaderIter等。 以下是我用的一种方法。 首先我的数据是存在data_dir里边...
  • 写在之前 介绍 Pytorch深度学习框架优势之一是python优先,源代码由python代码层和C语言代码层组成,一般只需要理解python代码层就可以深入理解pytorch框架的计算原理。所以学习pytorch源码需要熟练掌握python语言...
  • 在使用 pytorch 构建深度学习相关的项目时,通常需要经过【模型结构】-【损失函数定义】-【数据设置】-【训练代码】-【log、...本文即将介绍 torch.utils.data 中的 DatasetDataloader 的基本用法,以 Unpaire...
  • 前言:系列文章的前面两篇文章已经很明确的说明了如何使用DataSet类和DataLoader类,而且第二篇文章中详细介绍了DataLoader类中的几个重要的常用的参数,如sampler参数、collate_fn参数,但是在数据与处理的过程中,...
  • 目录 一、概念 二、Dataset的创建和使用 三、DataLoader的创建和使用 *四、将Dataset数据和标签放在GPU上(代码执行顺序出错则会有bug) 五、DatasetDataLoader总结 一、概念 1.torch.utils.data.dataset这...
  • 读入并处理数据后用网络训练分类器 一、关于数据 为了将数据喂入神经网络,其基本处理思路是:利用python...在pytorch中,先将数据集包装为一个Dataset,然后再将Dataset包装成一个更好操作的Dataloader cv处理上,.
  • 接下来几篇博文开始,介绍pytorch五大模块中的数据模块,所有概念都会以第四代人民币1元和100元纸币的二分类问题为例来具体介绍,在实例中明白相关...Dataloader涉及两个部分,一是sampler部分,用于生成数据的索引
  • Dataset 相关源码1.1. `Dataset`1.2. `IterableDataset`1.3. `TensorDataset`1.4. `ConcatDataset`1.5. `ChainDataset`1.6. `Subset`1.7. 方法 `random_split`2. Sampler 源码2.1. Sampler2.2. SequentialSampler...
  • Dataloader ...torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=False, sampler=None, batch_sampler=None, num_workers=0, collate_fn=None, pin_memory=False, drop_last=F...
  • 1.写个数据集的类(myDataset ),并继承Dataset 在myDataset 类中实现__len__()和__getitem__两个函数, __len__返回数据集的总长,__getitem__返回每次按照 索引所取的项,即x, y 比如:在处理序列问题时: __...
  • 首先我们看一下DataLoader.__next__的源代码长什么样,为方便理解我只选取了num_works为0的情况(num_works简单理解就是能够并行化地读取数据)。 class DataLoader(object): ... def __next__(self): if self...
  • 前言:前面的系列文章之第一篇已经基本上说明了DataSet类和DataLoader类的用法,但是鉴于DataLoader类中有一个参数collate_fn使用起来比较复杂,所以本次的第二篇文章还专门说一下这个函数的功能。第一篇文章请参考...
  • 前言:前面有系列文章讲解了DatasetDataLoader,Transform三者之间的关系,里面在讲到Sampler的时候提到那是一个“采样器”,没有深入介绍,本文续接前面的文章,参考: (第一篇)pytorch数据预处理三剑客之——...
  • 在gluon接口中,通过DatasetDataLoader来对数据集进行循环遍历,并返回batch大小的数据,其中Dataset对象用于数据的收集、加载和变换,而DataLoader对象用于返回batch大小的数据。 Dataset 所有Dataset类中,都有...
  • Pytorch数据读取DataLoaderDataset 包含一个实例程序, 人民币二分类程序, 主要是学习数据集的划分和读取

空空如也

1 2 3 4 5 ... 20
收藏数 309,862
精华内容 123,944
关键字:

dataset