我有一个从文件创建MessageDigest(哈希)的方法,我需要对很多文件(> = 100,000)执行此操作.我应该用多大的缓冲区来读取文件以最大限度地提高性能?
大多数人都熟悉基本代码(我将在这里重复以防万一):
MessageDigest md = MessageDigest.getInstance( "SHA" );
FileInputStream ios = new FileInputStream( "myfile.bmp" );
byte[] buffer = new byte[4 * 1024]; // what should this value be?
int read = 0;
while( ( read = ios.read( buffer ) ) > 0 )
md.update( buffer, 0, read );
ios.close();
md.digest();
Run Code Online (Sandbox Code Playgroud)
什么是最大化吞吐量的缓冲区的理想大小?我知道这是依赖于系统的,我很确定它的操作系统,文件系统和硬盘依赖,并且可能还有其他硬件/软件.
(我应该指出,我对Java有点新手,所以这可能只是一些我不知道的Java API调用.)
编辑:我不提前知道将要使用的系统类型,所以我不能假设很多.(因为那个原因,我正在使用Java.)
编辑:上面的代码缺少像try..catch这样的东西,以使帖子更小
我正在编写一个小型I/O库来协助更大的(业余爱好)项目.该库的一部分对文件执行各种功能,该文件通过FileStream对象读/写.每次StreamReader.Read(...)通过时,
我将启动一个事件,该事件将在主应用程序中用于显示进度信息.在循环中进行的处理是有缺陷的,但不是太耗时(例如,它可能只是一个简单的文件副本,或者可能涉及加密...).
我的主要问题是:使用的最佳内存缓冲区大小是多少?考虑到物理磁盘布局,我可以选择2k,这将覆盖CD扇区大小,并且是512字节硬盘扇区的很好的倍数.在抽象树的上方,你可以选择一个更大的缓冲区,它可以一次读取整个FAT簇.我意识到今天的PC,我可以选择更多的内存饥饿选项(例如几个MiB),但随后我增加了UI更新之间的时间,并且用户感觉到响应速度较慢的应用程序.
顺便说一句,我最终希望为FTP/HTTP服务器上托管的文件提供类似的界面(通过本地网络/快速DSL).那些最佳的内存缓冲区大小(再次,感知响应性与性能之间的"最佳情况"权衡)?
我遇到了一个情况,我有一个非常大的文件,我需要从中读取二进制数据.
因此,我意识到.NET中的默认BinaryReader实现非常慢.用.NET Reflector查看它后,我发现了这个:
public virtual int ReadInt32()
{
if (this.m_isMemoryStream)
{
MemoryStream stream = this.m_stream as MemoryStream;
return stream.InternalReadInt32();
}
this.FillBuffer(4);
return (((this.m_buffer[0] | (this.m_buffer[1] << 8)) | (this.m_buffer[2] << 0x10)) | (this.m_buffer[3] << 0x18));
}
Run Code Online (Sandbox Code Playgroud)
这让我觉得非常低效,想到自32位CPU发明以来计算机是如何设计用于32位值的.
所以我使用这样的代码创建了我自己的(不安全的)FastBinaryReader类:
public unsafe class FastBinaryReader :IDisposable
{
private static byte[] buffer = new byte[50];
//private Stream baseStream;
public Stream BaseStream { get; private set; }
public FastBinaryReader(Stream input)
{
BaseStream = input;
}
public int ReadInt32()
{
BaseStream.Read(buffer, 0, 4);
fixed …Run Code Online (Sandbox Code Playgroud) 我正在编写一个需要读取相当大的文件的应用程序.我一直想知道在现代Windows XP计算机上读取缓冲区的最佳大小是多少.我用Google搜索并发现许多例子,其中1024是最佳尺寸.
这是我的意思的片段:
long pointer = 0;
buffer = new byte[1024]; // What's a good size here ?
while (pointer < input.Length)
{
pointer += input.Read(buffer, 0, buffer.Length);
}
Run Code Online (Sandbox Code Playgroud)
我的应用程序相当简单,所以我不打算编写任何基准测试代码,但是想知道常见的大小是多少?
我有这个简单的代码,它将文本文件合并到一个文本文件中:
void Main()
{
const int chunkSize = 2 * 1024; // 2KB
var inputFiles = new[] { @"c:\1.txt", @"c:\2.txt", @"c:\3.txt" };
using (var output = File.Create(@"c:\output.dat"))
{
foreach (var file in inputFiles)
{
using (var input = File.OpenRead(file))
{
var buffer = new byte[chunkSize];
int bytesRead;
while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, bytesRead);
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是关于chunkSize大小.
我怎么知道我选择的号码是否合适?(1024*2)
我正试图找到空闲的公式:
假设每个文件大小都是F mb,而且我有R mbRam和我的Hd的块大小B kb- 是否有任何公式我可以构建以找到空闲缓冲区大小?
c# ×3
performance ×3
.net ×2
buffer ×2
binaryreader ×1
c#-4.0 ×1
file ×1
file-io ×1
filesystems ×1
io ×1
java ×1
optimization ×1
pointers ×1
size ×1
unsafe ×1
windows ×1