许多Cygwin程序会尽可能利用你所能提供的所有RAM。
例如,如果你使用带有大型数据集的R的Cygwin版本,你应该尽快切换到64位Cygwin,因为R想要将整个数据集加载到RAM中,因此在64位机器上使用32位Cygwin人为地限制了R在Cygwin下的实现能力。
Cygwin处理fork()
调用时的DLL方式要求它们被加载到固定的内存地址。
(这是rebase
机制,通常在每次运行Cygwin的setup.exe
结束时自动运行。)
其中一个后果是,在32位Cygwin中安装了太多的软件包,导致rebase
试图给它们分配所有唯一的加载地址时,会耗尽地址空间。64位地址空间指数级增长消除了这种可能性,从实际目的来看。
64位Cygwin在某些情况下也可能更快。
您可以同时安装和运行两个版本的Cygwin。您甚至可以同时打开每个版本的MinTTY窗口。然而,最好将它们视为独立的世界,因为这两个Cygwin是基本不兼容的。如果您尝试让它们相互操作,就会遇到麻烦。
这种基本的不兼容性可能会以几种方式影响您:
尽管64位Cygwin程序可以启动32位Cygwin程序,反之亦然,但是一些跨进程机制在这个边界上不会起作用:POSIX共享内存、文件句柄传递、getppid(2)
等。
即使你没有考虑到的一些跨进程操作,在试图让两个不同的Cygwin互操作时也会失败。例如,Cygwin的/proc
目录中的大部分内容都来自于DLL,因此在两个同时在同一台机器上运行的Cygwin中,它们将是不同的。
假设您想要在Cygwin之间共享/usr/local
,以便无需拥有从源代码构建的所有软件的两个副本。
阅读上面的第一条后,您意识到您不能共享/usr/local/bin
或/usr/local/lib
。
经过思考,您决定只共享/usr/local/src
,以至少不必拥有重复的源代码树。如果您在源码树中构建任何这些程序,这仍然会导致问题。(即./configure && make && make install
)
这出现的原因有两个:
生成的二进制文件(*.o
、*.so
、*.a
、*.exe
等)在两个Cygwin之间是不兼容的,因此除非您在切换Cygwin时执行make clean
,否则它们将被遗留下来,导致混乱。
即使您记得make clean
,每个Cygwin下的./configure
的输出也可能是不同的,因此试图在32位Cygwin下配置的情况下构建64位Cygwin中的程序(反之亦然)可能会失败。
有几种方法可以摆脱这个困境:
放弃共享/usr/local/src
。
记得在切换Cygwin时执行make clean && ./configure
。
为每个Cygwin变体单独构建build out-of-tree。
这比前一个选项更清洁、更快速、更可靠,但并非所有源代码树都设置为允许这样做。
升级到64位的另一个问题是,据我所知,没有办法自动重新安装与32位安装相同的软件包列表,因此您将不得不费力地列出已安装的软件包,并逐个检查它们以在新安装中勾选所有软件包,以便回到重新安装之前的状态。
cygcheck -c | sed -e 's/ .*//' | sed '1,2d' > packageList.out
将创建一个漂亮的列表,列出所有已安装的软件包。然后,您可以使用 -P
开关从命令行运行 setup*.exe
安装您可从输出文件中获取的软件包列表,方法为 $(paste -d, -s packageList.out)
。我有所有这些的脚本,因此我可以在32位和64位的多台计算机上重新生成我的Cygwin环境。您需要先进行基本安装,然后再添加其他已安装的软件包。 - SeeJayBee使用Cygwin x64有许多优势之一是更好的内存管理。我曾经遇到很多“地址已被使用”或“fork:重试:资源暂时不可用”的问题,这迫使我有时一天要运行几次“rebaseall”。
但是,使用Cygwin x64我从未遇到过这样的问题。
安装两者。这不需要太多时间或磁盘空间,而且一些软件包在cygwin64上不可用。(将它们放在不同的目录中!)
我不知道cygwin64中的sqlite3是否能够索引大小超过约4G的数据库,但我知道cygwin32中的sqlite3不能,64位Linux中的sqlite3可以。
cygwin64仍然没有pdftk(PDF工具包)。
声望不足,无法在所选答案上发表评论,因此在此提出:
安装Cygwin64到c:\cygwin
(通过setup-x86_64.exe
),然后在c:\cygwin32
中进行第二个Cygwin32安装(通过setup-x86.exe
),最后将/cygdrive/c/cygwin32/<for_each_of_the_bin_dirs>
添加到$PATH的末尾,这样就可以默认运行64位应用程序,但如果没有64位版本,则允许调用32位应用程序。
如果setup-x86_64.exe
能够呈现所有Cygwin应用程序的版本感知统一列表,并且仅在需要时执行32位安装(并弹出建议进行64位移植的弹出窗口),那将非常有用。
libwhatever.dll
时,这会带来问题。很可能会导致崩溃。 - rr-