操作无法完成,因为可用存储空间不足。

23

环境:

  • Visual Studio Ultimate 2010
  • Windows XP
  • 使用.NET 4.0的WPF桌面应用程序/li>

我们有一个播放视频的桌面应用程序。该视频是项目的一部分,并打包到安装程序中。但有时构建安装程序会显示以下错误消息:

没有足够的存储空间完成此操作

如果我重新启动Visual Studio,它就可以正常工作。

有没有办法避免这种情况?有没有更好的方法来在安装程序中打包视频?

11个回答

13

通常在构建过程中需要大量的RAM内存而无法获得时,会出现这种情况。由于重新启动Visual Studio可以解决问题,很可能也适用于你的情况。

尝试关闭一些正在运行的应用程序。您还可以尝试增加计算机的RAM或增加页面文件大小。


8
根据我的经验不是真的:在构建过程中,我的 RAM 利用率只有四分之一,并且没有明显的峰值。我曾在其他地方看到 Cosmin 给出这个标准答案,如果可以的话我会给它点踩。 - Barton
1
虽然我同意重新启动是解决方案之一,但这并不是原因,就像@Barton所建议的那样,当RAM充足时也会出现此错误。在VS2012中也会发生。因此,这个问题的根源可能是Daniel建议的 - bPratik
我完全同意。我们项目中的前任开发人员将一个巨大的数据库模板(测试已经填充了大量数据)嵌入到应用程序中。自从将数据库移出应用程序并放置在资源文件夹中后,我就没有看到这个问题再次出现。谢谢,伙计们。 - Barton

9
我在尝试在Windows XP的Visual Studio 2010中编译C#解决方案时遇到了这个问题。一个项目有相当多的嵌入资源(生成的程序集大小约为140MiB),由于出现以下错误,我无法编译该解决方案:

没有足够的存储空间来完成此操作

在我的构建输出中报错。

这个问题的任何答案都没有帮助,但我在 social.msdn.microsoft.com 上找到了一个关于 "Not enough storage is available to complete this operation" 的答案,作者是 ScottBurton42。它建议将 3GB 开关添加到 Boot.ini 文件中,并使 devenv.exe 具有大地址空间。对我的解决方案是在我的 Boot.ini 文件中添加 3GB 开关(我认为 Visual Studio 2010 及以上版本的 devenv.exe 已经具有大地址空间)。

我的答案基于那个答案。


解决方案1:设置/3GB Boot.ini开关

MSDN上的内存支持和Windows操作系统页面说:

The virtual address space of processes and applications is still limited to 2 GB unless the /3GB switch is used in the Boot.ini file.

The /3GB switch allocates 3 GB of virtual address space to an application that uses IMAGE_FILE_LARGE_ADDRESS_AWARE in the process header. This switch allows applications to address 1 GB of additional virtual address space above 2 GB.

The virtual address space of processes and applications is still limited to 2 GB, unless the /3GB switch is used in the Boot.ini file. The following example shows how to add the /3GB parameter in the Boot.ini file to enable application memory tuning:

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(2)\WINNT

[operating systems]
multi(0)disk(0)rdisk(0)partition(2)\WINNT="????" /3GB

Note "????" in the previous example is be the programmatic name of the operating system.

在 Windows XP 中,可以通过以下步骤修改 Boot.ini 文件:
系统属性 → 高级 → 启动和故障恢复 → 设置 → 系统启动 → 编辑
MSDN 上有关 /3GB 开关的页面如下:
在 Windows 的 32 位版本中,/3GB 参数启用 4 GT RAM 调整功能,该功能将用户模式虚拟地址空间扩大到 3 GB,并将内核模式组件限制为剩余的 1 GB。 /3GB 参数支持 Windows Server 2003、Windows XP 和 Windows 2000。在 Windows Vista 和后续版本中,请使用 BCDEdit 中的 IncreaseUserVA 元素。
重新启动计算机即可使设置生效。
解决方案2:使devenv.exe支持大地址(large address aware)。
  1. Open up a Visual Studio Command Prompt (or a Developer Command Prompt, depending on the version of Visual Studio)

  2. Type and execute the following command line:

    editbin /LARGEADDRESSAWARE {path}\devenv.exe`
    

    where {path} is the path to devenv.exe (you can find this by going to the properties of the Visual Studio shortcut).

这将允许devenv.exe访问3GB内存,而不是2GB。

1
解决方案2需要在我的计算机上以管理员身份运行Visual Studio命令提示符。 - ZivS
在以管理员模式运行开发人员命令提示符后,解决方案#2对我有用(我正在使用VS 2017,因此似乎“devenv.exe适用于VS 2010+已经是大地址感知的”语句可能是错误的)。谢谢! - Sen Jacob

8

问题

在我的案例中,问题出在一个测试项目里,它包含了一个非常大的(1.5GB)测试文件作为嵌入资源。此时我的机器上有16GB RAM,其中8GB是空闲的,所以RAM不是问题。

可能我们遇到了CLR对任何单个对象的2GB限制。不深入研究MSBuild正在进行的操作,我只能推测在编译时,嵌入资源被加载到一个对象图中,达到了这个限制。

错误信息非常无用。我看到它时,首先想到的是,“难道我的磁盘空间已经用完了吗?”

解决方案

这是一个文件验证测试项目。其中一个要求是能够处理这样大小的文件,因此,初步看来,我的团队认为将其嵌入以供测试是合理的。

我们通过将文件移到网络上(以与生产环境中的验证器访问方式相同),并将测试标记为集成测试而不是单元测试来修复错误。毕竟,单元测试应该是快速运行的,不是吗?


4
清理并重新构建解决方案对我有用。

3
对于Visual Studio,您可以尝试以下操作:
  1. 关闭所有Visual Studio实例。
  2. 管理员模式打开Visual Studio Developer工具。
  3. 导航到:
    C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE
  4. 键入以下内容:
    editbin /LARGEADDRESSAWARE devenv.exe
  5. 最好也重新启动计算机。
希望这可以帮助您。

2

在我的情况下,C盘的可用内存非常少。我从C盘中清除了一些项目并重新尝试了一次。这次成功了。


2

虽然我回答晚了,但是以后参考的话,你可能需要检查一下Windows转储文件设置(并且可能将其设置为“无”)。


2
在我的案例中,我执行代码的服务器无法处理我的并行化代码。
通常情况下,我运行以下设置:
new ParallelOptions { MaxDegreeOfParallelism = Math.Max(1, Environment.ProcessorCount / 2) }

引入一个变量并将使用的核心锁定为1(导致代码类似于以下代码),这对我解决了这个问题。

new ParallelOptions { MaxDegreeOfParallelism = 1 }

0

我通过删除或禁用(排除)大尺寸的*.rpt文件来解决这个问题;并且我已经优化了我的报告!


0
对我来说关键是:我们已将一个巨大的数据库模板(测试已填充了大量数据)嵌入到应用程序中。自从将嵌入式资源适当地移除并将数据库移动到资源文件夹后,我就没有再遇到这个问题了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接