这似乎是整个网络上一个臭名昭着的错误.因为我的情景不适合,所以我无法找到问题的答案.将图像保存到流时会抛出异常.
奇怪的是这与png完美配合,但是jpg和gif给出了上述错误,这是相当混乱的.
最相似的问题涉及将图像保存到没有权限的文件.具有讽刺意味的是,解决方案是使用内存流,因为我正在做....
public static byte[] ConvertImageToByteArray(Image imageToConvert)
{
using (var ms = new MemoryStream())
{
ImageFormat format;
switch (imageToConvert.MimeType())
{
case "image/png":
format = ImageFormat.Png;
break;
case "image/gif":
format = ImageFormat.Gif;
break;
default:
format = ImageFormat.Jpeg;
break;
}
imageToConvert.Save(ms, format);
return ms.ToArray();
}
}
Run Code Online (Sandbox Code Playgroud)
更多细节到例外.造成这么多问题的原因是缺乏解释:(
System.Runtime.InteropServices.ExternalException was unhandled by user code
Message="A generic error occurred in GDI+."
Source="System.Drawing"
ErrorCode=-2147467259
StackTrace:
at System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams)
at System.Drawing.Image.Save(Stream stream, ImageFormat format)
at Caldoo.Infrastructure.PhotoEditor.ConvertImageToByteArray(Image imageToConvert) in C:\Users\Ian\SVN\Caldoo\Caldoo.Coordinator\PhotoEditor.cs:line 139
at …
Run Code Online (Sandbox Code Playgroud) 我正在处理的产品每天收集数千个读数并将它们存储为NTFS分区(Windows XP)上的64k二进制文件.经过一年的生产,一个目录中有超过300000个文件,而且这个数字还在不断增长.这使得从Windows资源管理器访问父/祖先目录非常耗时.
我试过关闭索引服务,但没有区别.我还考虑将文件内容移动到数据库/ zip文件/ tarball中,但对我们来说单独访问文件是有益的.基本上,这些文件仍然需要用于研究目的,研究人员不愿意处理任何其他事情.
有没有办法优化NTFS或Windows,以便它可以使用所有这些小文件?
可能重复:
目录中有多少文件太多?
有人告诉我,在目录中放置太多文件会导致Linux和Windows出现性能问题.这是真的?如果是这样,避免这种情况的最佳方法是什么?
我可能会参与一个项目,其中一个重要组件是大量文件的存储(在这种情况下是图像,但它应该只是作为文件存储).
传入文件的数量预计约为每周500,000(平均每个约100 Kb),每天大约100,000个文件,每秒5个.在达到平衡状态之前,文件总数预计将达到数千万,其中文件因输入速率的各种原因而过期.
所以我需要一个系统,可以在高峰时间每秒存储大约5个文件,同时读取大约4个文件并随时删除4个文件.
我最初的想法是,一个简单的NTFS文件系统,其中包含一个简单的存储,过期和读取服务应该足够了.我可以想象服务创建每年,每月,每天和每小时的子文件夹,以保持每个文件夹的文件数量最少,并允许手动过期以防需要.
这里讨论了一个大型的NTFS解决方案,但我仍然可以使用一些建议来解决在构建具有上述规范的存储时会遇到的问题,期望的维护问题以及存在哪些替代方案.优选地,如果可能且实用的话,我想避免分布式存储.
编辑
感谢所有的意见和建议.关于该项目的更多奖励信息:
这不是最终用户提供图像的Web应用程序.没有透露太多,因为这是在合同阶段,它更多的是质量控制类别.想想带有传送带和传感器的生产工厂.这不是传统的质量控制,因为产品的价值完全取决于图像和元数据数据库的顺利运行.
自治应用程序以先进先出的顺序访问图像99%,但也会发生用户应用程序的随机访问.超过一天的图像将主要用于存档目的,但这一目的也非常重要.
由于各种原因,图像的到期遵循复杂的规则,但在某些日期,应删除所有图像.删除规则遵循依赖于元数据和用户交互的业务逻辑.
每天都会有停机时间,可以进行维护.
优选地,文件存储器不必将图像位置传送回元数据服务器.如果选择某种散列或分布式系统,则可以通过映射数据库从元数据中唯一地扣除图像位置.
所以我的问题是:
我需要在使用NTFS的Web服务器上存储大约600,000个图像.我最好将图像存储在子文件夹中的20,000个图像块中吗?(Windows Server 2008)
我担心在图像检索过程中会产生操作系统开销
我有一个应用程序在表中创建记录(火箭科学,我知道).用户希望将文件(.doc,.xls,.pdf等)与表中的单个记录相关联.
我应该将文件的内容存储在数据库中吗?这会膨胀数据库吗?
我应该将文件存储在文件服务器上,并将路径存储在数据库中吗?
做这个的最好方式是什么?
我正在编写一个应该处理许多小文件的程序,比如数千甚至数百万.我一直在测试500k文件的那一部分,第一步就是迭代一个目录,里面有大约45k目录(包括子目录的子目录等)和500k小文件.遍历所有目录和文件,包括获取文件大小和计算总大小大约需要6秒.现在,如果我尝试在遍历时打开每个文件并立即关闭它,它看起来永远不会停止.事实上,它需要太长时间(小时......).自从我在Windows上执行此操作后,我尝试使用CreateFileW,_wfopen和_wopen打开文件.我没有在文件上读或写任何东西,尽管在最后的实现中我只需要阅读.但是,我没有看到任何尝试都有明显的改善.
我想知道是否有一种更有效的方法来打开具有任何可用功能的文件,无论是C,C++还是Windows API,或者唯一更有效的方式是读取MFT并直接读取磁盘块,我我想避免?
更新:我正在处理的应用程序是使用版本控制进行备份快照.因此,它还具有增量备份.500k文件的测试是在一个巨大的源代码库上完成的,以便进行版本控制,就像scm一样.因此,所有文件都不在一个目录中.还有大约45k目录(如上所述).
因此,建议的压缩文件解决方案没有帮助,因为当备份完成时,就是访问所有文件的时候.因此,我认为没有任何好处,甚至会产生一些性能成本.
我需要在启动时阅读数千个小文件的内容.在linux上,只需使用fopen和读取速度非常快.在Windows上,这种情况发生得非常缓慢.
我已经使用ReadFileEx切换到使用Overlapped I/O(异步I/O),其中Windows在数据准备好读取时进行回调.
但是,实际上成千上万次调用CreateFile本身仍然是一个瓶颈.请注意,我提供自己的缓冲区,打开NO_BUFFERING标志,提供SERIAL提示等.但是,对CreateFile的调用需要几十秒的时间,而在Linux上,所有操作都要快得多.
有什么办法可以让这些文件更快地准备好阅读吗?
对CreateFile的调用是:
hFile = CreateFile(szFullFileName,
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING | FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
Run Code Online (Sandbox Code Playgroud) 在结构中获得超过4000000个jpeg文件后,我们添加了新的问题.File.Copy抛出异常:由于文件系统限制,无法完成请求的操作.
有解决方案吗
信息
码
public bool AddFile(Uri uri, string path, bool withDelete = false)
{
var sourceFilePath = path;
var destinationFilePath = Path.GetFullPath(uri.LocalPath);
try
{
if (!File.Exists(sourceFilePath))
{
sourceFilePath = Directory.EnumerateFiles(sourceFilePath).FirstOrDefault();
destinationFilePath = Path.Combine(destinationFilePath, Path.GetFileName(sourceFilePath));
}
if (!Directory.Exists(Path.GetDirectoryName(destinationFilePath)))
Directory.CreateDirectory(Path.GetDirectoryName(destinationFilePath));
if (withDelete && File.Exists(destinationFilePath))
File.Delete(destinationFilePath);
File.Copy(sourceFilePath, destinationFilePath);
return true;
}
catch (Exception exc)
{
ServiceCore.GetLogger().Error(exc);
throw exc;
}
}
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪
2013-03-28 14:10:48.3784[Info]: 47356388:Unive.NetService.SimpleServices.DocumentManagementSerivce..ctor: Entry
2013-03-28 14:10:48.4740[Info]: Static:Unive.NetService.SimpleServices.DocumentManagementSerivce..ctor: …
Run Code Online (Sandbox Code Playgroud) 我的网站有近百万张图片,它们存储在我的Windows服务器上的一个文件夹中.
由于直接在桌面上打开此文件夹驱动我和我的CPU疯狂,我想知道是否使用我的PHP脚本获取其中一个用于HTTP请求也是费力的.
那么,将它们分成不同的文件夹可以提高性能吗?
windows ×4
ntfs ×3
c# ×2
file ×2
file-io ×2
filesystems ×2
performance ×2
.net ×1
architecture ×1
c++ ×1
database ×1
exception ×1
file-storage ×1
gdi+ ×1
http ×1
io ×1
linux ×1
php ×1
winapi ×1
windows-xp ×1