将大型二进制文件 (5GB) 读入 C# 中的字节数组?
Read a large binary file(5GB) into a byte array in C#?
我有一个超过 5 GB 的录音文件(二进制文件),我必须读取该文件并过滤出需要发送到服务器的数据。
问题是 byte[] 数组最多支持 2GB 的文件数据。所以如果有人已经处理过这种情况,就需要帮助。
using (FileStream str = File.OpenRead(textBox2.Text))
{
int itemSectionStart = 0x00000000;
BinaryReader breader = new BinaryReader(str);
breader.BaseStream.Position = itemSectionStart;
int length = (int)breader.BaseStream.Length;
byte[] itemSection = breader.ReadBytes(length ); //first frame data
}
问题:
1: Length is crossing the range of integer.
2: tried using long and unint but byte[] only supports integer
编辑。
我想尝试另一种方法,基于帧缓冲区读取数据,假设我的帧缓冲区大小为 24000。所以字节数组存储那么多帧数据,然后处理帧数据,然后刷新字节数组并存储另外 24000 帧数据。直到继续直到二进制文件结束..
如评论中所述,我认为您必须使用流来读取文件。执行此操作的方法如下:
int nbRead = 0;
var step = 10000;
byte[] buffer = new byte[step];
do
{
nbRead = breader.Read(buffer, 0, step);
hugeArray.Add(buffer);
foreach(var oneByte in hugeArray.SelectMany(part => part))
{
// Here you can read byte by byte this subpart
}
}
while (nbRead > 0);
如果我很了解您的需求,您正在寻找文件中的特定模式?
我认为您可以通过逐字节查找模式的开头来做到这一点。一旦找到它,就可以开始阅读重要的字节。如果整个重要数据大于2GB,如评论中所述,则必须将其分几部分发送到您的服务器。
看到你不能一次读取那么大的文件,所以你必须将文件分成小部分然后处理文件。
OR
使用缓冲区概念读取文件,并在完成缓冲区数据后刷新该缓冲区。
我遇到了同样的问题,所以我尝试了基于缓冲区的方法,它对我有用。
FileStream inputTempFile = new FileStream(Path, FileMode.OpenOrCreate, FileAccess.Read);
Buffer_value = 1024;
byte[] Array_buffer = new byte[Buffer_value];
while ((bytesRead = inputTempFile.Read(Array_buffer, 0, Buffer_value)) > 0)
{
for (int z = 0; z < Array_buffer.Length; z = z + 4)
{
string temp_id = BitConverter.ToString(Array_buffer, z, 4);
string[] temp_strArrayID = temp_id.Split(new char[] { '-' });
string temp_ArraydataID = temp_strArrayID[0] + temp_strArrayID[1] + temp_strArrayID[2] + temp_strArrayID[3];
}
}
您可以通过这种方式处理您的数据。
对于我的情况,我试图将缓冲区读取的数据存储到一个列表中,它可以正常工作直到 2GB 数据,之后它会抛出内存异常。
我采用的方法是从缓冲区读取数据并应用所需的过滤器并将过滤器数据写入文本文件,然后处理该文件。
//文本文件方式
FileStream inputTempFile = new FileStream(Path, FileMode.OpenOrCreate, FileAccess.Read);
Buffer_value = 1024;
StreamWriter writer = new StreamWriter(Path, true);
byte[] Array_buffer = new byte[Buffer_value];
while ((bytesRead = inputTempFile.Read(Array_buffer, 0, Buffer_value)) > 0)
{
for (int z = 0; z < Array_buffer.Length; z = z + 4)
{
string temp_id = BitConverter.ToString(Array_buffer, z, 4);
string[] temp_strArrayID = temp_id.Split(new char[] { '-' });
string temp_ArraydataID = temp_strArrayID[0] + temp_strArrayID[1] + temp_strArrayID[2] + temp_strArrayID[3];
if(temp_ArraydataID =="XYZ Condition")
{
writer.WriteLine(temp_ArraydataID);
}
}
}
writer.Close();
我有一个超过 5 GB 的录音文件(二进制文件),我必须读取该文件并过滤出需要发送到服务器的数据。
问题是 byte[] 数组最多支持 2GB 的文件数据。所以如果有人已经处理过这种情况,就需要帮助。
using (FileStream str = File.OpenRead(textBox2.Text))
{
int itemSectionStart = 0x00000000;
BinaryReader breader = new BinaryReader(str);
breader.BaseStream.Position = itemSectionStart;
int length = (int)breader.BaseStream.Length;
byte[] itemSection = breader.ReadBytes(length ); //first frame data
}
问题:
1: Length is crossing the range of integer.
2: tried using long and unint but byte[] only supports integer
编辑。
我想尝试另一种方法,基于帧缓冲区读取数据,假设我的帧缓冲区大小为 24000。所以字节数组存储那么多帧数据,然后处理帧数据,然后刷新字节数组并存储另外 24000 帧数据。直到继续直到二进制文件结束..
如评论中所述,我认为您必须使用流来读取文件。执行此操作的方法如下:
int nbRead = 0;
var step = 10000;
byte[] buffer = new byte[step];
do
{
nbRead = breader.Read(buffer, 0, step);
hugeArray.Add(buffer);
foreach(var oneByte in hugeArray.SelectMany(part => part))
{
// Here you can read byte by byte this subpart
}
}
while (nbRead > 0);
如果我很了解您的需求,您正在寻找文件中的特定模式?
我认为您可以通过逐字节查找模式的开头来做到这一点。一旦找到它,就可以开始阅读重要的字节。如果整个重要数据大于2GB,如评论中所述,则必须将其分几部分发送到您的服务器。
看到你不能一次读取那么大的文件,所以你必须将文件分成小部分然后处理文件。
OR
使用缓冲区概念读取文件,并在完成缓冲区数据后刷新该缓冲区。
我遇到了同样的问题,所以我尝试了基于缓冲区的方法,它对我有用。
FileStream inputTempFile = new FileStream(Path, FileMode.OpenOrCreate, FileAccess.Read);
Buffer_value = 1024;
byte[] Array_buffer = new byte[Buffer_value];
while ((bytesRead = inputTempFile.Read(Array_buffer, 0, Buffer_value)) > 0)
{
for (int z = 0; z < Array_buffer.Length; z = z + 4)
{
string temp_id = BitConverter.ToString(Array_buffer, z, 4);
string[] temp_strArrayID = temp_id.Split(new char[] { '-' });
string temp_ArraydataID = temp_strArrayID[0] + temp_strArrayID[1] + temp_strArrayID[2] + temp_strArrayID[3];
}
}
您可以通过这种方式处理您的数据。
对于我的情况,我试图将缓冲区读取的数据存储到一个列表中,它可以正常工作直到 2GB 数据,之后它会抛出内存异常。
我采用的方法是从缓冲区读取数据并应用所需的过滤器并将过滤器数据写入文本文件,然后处理该文件。
//文本文件方式
FileStream inputTempFile = new FileStream(Path, FileMode.OpenOrCreate, FileAccess.Read);
Buffer_value = 1024;
StreamWriter writer = new StreamWriter(Path, true);
byte[] Array_buffer = new byte[Buffer_value];
while ((bytesRead = inputTempFile.Read(Array_buffer, 0, Buffer_value)) > 0)
{
for (int z = 0; z < Array_buffer.Length; z = z + 4)
{
string temp_id = BitConverter.ToString(Array_buffer, z, 4);
string[] temp_strArrayID = temp_id.Split(new char[] { '-' });
string temp_ArraydataID = temp_strArrayID[0] + temp_strArrayID[1] + temp_strArrayID[2] + temp_strArrayID[3];
if(temp_ArraydataID =="XYZ Condition")
{
writer.WriteLine(temp_ArraydataID);
}
}
}
writer.Close();