Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将大量数据封送到XML_Xml_Go_Marshalling - Fatal编程技术网

如何将大量数据封送到XML

如何将大量数据封送到XML,xml,go,marshalling,Xml,Go,Marshalling,我需要通过XML发送大量数据,而我的Docker容器在执行任务时内存不足。是否有一种方法可以使用Go以增量方式封送一个大型XML文档,并将其增量写入一个文件,从而最大限度地减少内存使用量?用于将XML输出流式传输到一个可能是网络连接()或文件()的。完整的结果将不会保存在内存中 您可以使用将Go值编码为XML。通常,您可以传递任何要传递给的Go值 Encoder.Encode()仅当要封送的数据已在内存中准备就绪时才有帮助,这对您来说可能可行,也可能不可行。例如,如果你想封送一个无法(或不应该)

我需要通过XML发送大量数据,而我的Docker容器在执行任务时内存不足。是否有一种方法可以使用Go以增量方式封送一个大型XML文档,并将其增量写入一个文件,从而最大限度地减少内存使用量?

用于将XML输出流式传输到一个可能是网络连接()或文件()的。完整的结果将不会保存在内存中

您可以使用将Go值编码为XML。通常,您可以传递任何要传递给的Go值

Encoder.Encode()
仅当要封送的数据已在内存中准备就绪时才有帮助,这对您来说可能可行,也可能不可行。例如,如果你想封送一个无法(或不应该)读入内存的大列表,这对你来说并不是一个救赎

如果输入数据也不能保存在内存中,那么可以通过标记和元素构造XML输出。您可以使用它来编写结果XML文档的“部分”

例如,如果您想将一个大列表写入输出,您可以编写一个开始元素标记(例如,
),然后逐个写入列表的元素(每个元素都从数据库或文件中获取,或通过动态算法构造),一旦列表被封送,您可以关闭列表元素标记(

下面是一个简单的示例,说明如何做到这一点:

type Student struct {
    ID   int
    Name string
}

func main() {
    he := func(err error) {
        if err != nil {
            panic(err) // In your app, handle error properly
        }
    }

    // For demo purposes we use an in-memory buffer,
    // but this may be an os.File too.
    buf := &bytes.Buffer{}

    enc := xml.NewEncoder(buf)
    enc.Indent("", "  ")

    he(enc.EncodeToken(xml.StartElement{Name: xml.Name{Local: "list"}}))
    for i := 0; i < 3; i++ {
        // Here you can fetch / construct the records
        he(enc.Encode(Student{ID: i, Name: string(i + 'A')}))
    }
    he(enc.EncodeToken(xml.EndElement{Name: xml.Name{Local: "list"}}))
    he(enc.Flush())

    fmt.Println(buf.String())
}
type Student结构{
ID int
名称字符串
}
func main(){
he:=func(错误){
如果错误!=零{
恐慌(错误)//在你的应用程序中,正确处理错误
}
}
//出于演示目的,我们使用内存缓冲区,
//但这也可能是一个os.文件。
buf:=&bytes.Buffer{}
enc:=xml.NewEncoder(buf)
附件缩进(“,”)
he(enc.EncodeToken(xml.StartElement{Name:xml.Name{Local:“list”}}))
对于i:=0;i<3;i++{
//在这里,您可以获取/构造记录
他(enc.Encode(学生{ID:i,Name:string(i+'A')}))
}
he(enc.EncodeToken(xml.EndElement{Name:xml.Name{Local:“list”}}))
他(附件Flush())
fmt.Println(buf.String())
}
上面的输出是(在上尝试):


0
A.
1.
B
2.
C
用于将XML输出流式传输到可能是网络连接()或文件()的。完整的结果将不会保存在内存中

您可以使用将Go值编码为XML。通常,您可以传递任何要传递给的Go值

Encoder.Encode()
仅当要封送的数据已在内存中准备就绪时才有帮助,这对您来说可能可行,也可能不可行。例如,如果你想封送一个无法(或不应该)读入内存的大列表,这对你来说并不是一个救赎

如果输入数据也不能保存在内存中,那么可以通过标记和元素构造XML输出。您可以使用它来编写结果XML文档的“部分”

例如,如果您想将一个大列表写入输出,您可以编写一个开始元素标记(例如,
),然后逐个写入列表的元素(每个元素都从数据库或文件中获取,或通过动态算法构造),一旦列表被封送,您可以关闭列表元素标记(

下面是一个简单的示例,说明如何做到这一点:

type Student struct {
    ID   int
    Name string
}

func main() {
    he := func(err error) {
        if err != nil {
            panic(err) // In your app, handle error properly
        }
    }

    // For demo purposes we use an in-memory buffer,
    // but this may be an os.File too.
    buf := &bytes.Buffer{}

    enc := xml.NewEncoder(buf)
    enc.Indent("", "  ")

    he(enc.EncodeToken(xml.StartElement{Name: xml.Name{Local: "list"}}))
    for i := 0; i < 3; i++ {
        // Here you can fetch / construct the records
        he(enc.Encode(Student{ID: i, Name: string(i + 'A')}))
    }
    he(enc.EncodeToken(xml.EndElement{Name: xml.Name{Local: "list"}}))
    he(enc.Flush())

    fmt.Println(buf.String())
}
type Student结构{
ID int
名称字符串
}
func main(){
he:=func(错误){
如果错误!=零{
恐慌(错误)//在你的应用程序中,正确处理错误
}
}
//出于演示目的,我们使用内存缓冲区,
//但这也可能是一个os.文件。
buf:=&bytes.Buffer{}
enc:=xml.NewEncoder(buf)
附件缩进(“,”)
he(enc.EncodeToken(xml.StartElement{Name:xml.Name{Local:“list”}}))
对于i:=0;i<3;i++{
//在这里,您可以获取/构造记录
他(enc.Encode(学生{ID:i,Name:string(i+'A')}))
}
he(enc.EncodeToken(xml.EndElement{Name:xml.Name{Local:“list”}}))
他(附件Flush())
fmt.Println(buf.String())
}
上面的输出是(在上尝试):


0
A.
1.
B
2.
C

您目前是如何做到这一点的?
xml.Encoder()
不适合您吗?现在,我收集文档中应该包含的所有数据(4+GB),使用
xml.marshal
封送,然后使用
ioutil.WriteFile
。您目前是如何做的?
xml.Encoder()
不适合您吗?现在,我收集文档中应该包含的所有数据(4+GB),使用
xml.marshal
封送,然后使用
ioutil.WriteFile