将大型base64string发送到jsonbody

时间:2015-12-07 10:09:05

标签: c# base64

我使用弹性搜索进行一些集成。我需要将一个非常大的文件转换为base64string。一旦转换,我需要将它发送给ES。以下是我的代码。

    public IRestResponse ESMapFileAttachment(string indexName, string mappingName, string fileIndex, string fileName, Byte[] fileBytes)
    {
        var client = new RestClient(string.Format("{0}{1}/{2}/{3}", ConfigurationManager.AppSettings["esserver"], indexName, mappingName, fileIndex));
        var request = new RestRequest(Method.POST);
        request.AddHeader("Content-Type", "application/json");

        string encodedFileContent = Convert.ToBase64String(fileBytes); // got out of memory exception here
        var jsonString = @"
                                {
                                    ""file"": {
                                        ""_content"": ""XEncodedFileContentX"",
                                        ""_name"": ""XFilenameX"",
                                        ""_detect_language"": true,
                                        ""_indexed_chars"": -1
                                    }
                                }
                          ".Replace("XEncodedFileContentX", encodedFileContent)
                           .Replace("XFilenameX", fileName);

        var jsSerializer = new JavaScriptSerializer();
        jsSerializer.MaxJsonLength = Int32.MaxValue;
        var jObject = jsSerializer.DeserializeObject(jsonString);
        request.AddJsonBody(jObject);

        return client.Execute(request);
    }

但不知怎的,我得到了一个“内存不足”的声音。我尝试将其转换为base64string时出现异常。我已经尝试过低于10Mb的文件,它运行得很好。但是当它真的很大,甚至大约100Mb时,我得到了例外,即使我的PC是8GB RAM。

2 个答案:

答案 0 :(得分:0)

Base64会占用您输入的3个字节,并在输出时将其转换为4个字节的文本。这对你有好处,因为这意味着你可以获取较小的输入数据块并进行base64转换,然后你可以获取输入的下一个块并进行base64转换,当你将base64操作的第二个输出附加到第一个,你将得到与你一次转换整个事物相同的结果。

那么,解决问题的方法是采用固定大小的缓冲区,可以被3整除,例如3 * 1024 * 1024字节。并且您将在每一轮中使用它来转换3 MB的输入数据。在每一轮之后,您将其附加到StringBuilder,您将能够创建您正在寻找的大型结果。

话虽如此,我不确定那将是什么

.Replace("XEncodedFileContentX", encodedFileContent)

导致encodedFileContent具有该大小。您可能还需要找到该部分的替代方式......

答案 1 :(得分:0)

如果您需要将整个文件存储在内存中,则需要将目标平台更改为x64。另一种方法是使用较小的部分转换文件。 UTF8编码的字符每个字符最多可占用4个字节。我运行一个示例应用程序来转换170MB二进制文件,它将文件转换为226.000个字符串,应用程序消耗大约1GB RAM。