3

ファイルを読み込んでいます(このファイルは、長さが2GBの1つの長い文字列で構成されています)。

これは、ファイルのすべてのコンテンツをメモリに読み取り、文字列と場所を分割する私の関数です: *reader = StreamReader

public List<char[]> GetAllContentAsList()
        {
            int bytesToRead = 1000000;
            char[] buffer = new char[bytesToRead];
            List<char[]> results = new List<char[]>();

            while (_reader.Read(buffer, 0, bytesToRead) != 0)
            {
                char[] temp = new char[bytesToRead];
                Array.Copy(buffer,temp,bytesToRead);
                results.Add(temp);
            }

            return results;
        }

すべてのデータがリストに配置されると、RAM で 4 GB を占有します。ファイルのサイズがわずか 2 GB の場合、これはどのように可能ですか?

*編集

これが私がやったことです。バイト配列を文字列に変換するのではなく、バイトを操作して渡すだけです。これは、4 GB ではなくメモリ内の 2 GB のみのフィールドでした。

 public List<byte[]> GetAllContentAsList()
            {
                int bytesToRead = 1000000;
                var buffer = new byte[bytesToRead];
                List<byte[]> results = new List<byte[]>();

                while (_reader.Read(buffer, 0, bytesToRead) != 0)
                {
                    //string temp = Encoding.UTF8.GetString(buffer);
                    byte[] b = new byte[bytesToRead];
                    Array.Copy(buffer,b,bytesToRead);
                    results.Add(b);
                }

                return results;
            }
4

1 に答える 1

16

ここでの推測:

ファイルはUTF-8またはASCIIでエンコードされており、(ほとんどの場合) 1 バイト幅の文字 (またはほとんどが 1 バイト幅の他のコードページ) しか含まれていません。

現在、.NET 文字はすべて 2 (またはそれ以上) バイトの長さの UTF-16です。

したがって、メモリ内の文字は 2 倍のサイズになります。

于 2013-05-08T13:34:55.200 に答える