相关疑难解决方法(0)

使用FileInputStream时如何确定理想的缓冲区大小?

我有一个从文件创建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这样的东西,以使帖子更小

java filesystems performance file-io buffer

147
推荐指数
7
解决办法
10万
查看次数

带流的文件I/O - 最佳内存缓冲区大小

我正在编写一个小型I/O库来协助更大的(业余爱好)项目.该库的一部分对文件执行各种功能,该文件通过FileStream对象读/写.每次StreamReader.Read(...)通过时,

我将启动一个事件,该事件将在主应用程序中用于显示进度信息.在循环中进行的处理是有缺陷的,但不是太耗时(例如,它可能只是一个简单的文件副本,或者可能涉及加密...).

我的主要问题是:使用的最佳内存缓冲区大小是多少?考虑到物理磁盘布局,我可以选择2k,这将覆盖CD扇区大小,并且是512字节硬盘扇区的很好的倍数.在抽象树的上方,你可以选择一个更大的缓冲区,它可以一次读取整个FAT簇.我意识到今天的PC,我可以选择更多的内存饥饿选项(例如几个MiB),但随后我增加了UI更新之间的时间,并且用户感觉到响应速度较慢的应用程序.

顺便说一句,我最终希望为FTP/HTTP服务器上托管的文件提供类似的界面(通过本地网络/快速DSL).那些最佳的内存缓冲区大小(再次,感知响应性与性能之间的"最佳情况"权衡)?

c# size optimization buffer file

50
推荐指数
1
解决办法
4万
查看次数

.NET中更快(不安全)的BinaryReader

我遇到了一个情况,我有一个非常大的文件,我需要从中读取二进制数据.

因此,我意识到.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)

c# performance pointers unsafe binaryreader

24
推荐指数
4
解决办法
1万
查看次数

最佳文件缓冲区读取大小?

我正在编写一个需要读取相当大的文件的应用程序.我一直想知道在现代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)

我的应用程序相当简单,所以我不打算编写任何基准测试代码,但是想知道常见的大小是多少?

.net windows performance

19
推荐指数
1
解决办法
1万
查看次数

在C#中处理文件时确定缓冲区大小?

我有这个简单的代码,它将文本文件合并到一个文本文件中:

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- 是否有任何公式我可以构建以找到空闲缓冲区大小?

.net c# io c#-4.0

6
推荐指数
1
解决办法
9910
查看次数