2010-12-15 95 views
5

Perl一直是我的选择脚本语言,但我遇到了一个可怕的问题。默认情况下不支持长(64位)整数。大多数情况下,整数只是一个字符串,它们用于搜索大文件,但有很多地方它们不起作用,如二进制&,printf,pack,unpack,<<,>>哪种脚本语言支持长整型(64位)整数?

现在,这些工具可以在较新版本的Perl中工作,但前提是它使用64位整数支持构建,如果我想使便携式代码在没有此选项的情况下在Perls上运行,则无法提供帮助。而且,您并不总是能够控制运行代码的系统上的Perl。

我的问题是Python,PHP和Ruby遭受这样的问题,还是他们也依赖于版本和构建选项?

+7

出于好奇,任何使用bigint的原因;是不够的? – Hugmeir 2010-12-15 16:24:53

+0

@Hugmeir:只是它很慢。我正在处理MediaWiki转储文件,其大小可以是几TB! – hippietrail 2010-12-15 16:39:21

+1

@hippietrail,你确定64位数字是责任? – 2010-12-15 21:15:32

回答

14

高速硬件整数的大小(假定语言有它们)将总是取决于编译语言解释器(通常为C)的编译器可用的任何大小的整数。

如果您需要跨平台/跨版本的大整数支持,Perl编译指示use bigint;将会执行此操作。如果您需要更多控制,bigint是模块Math::BigInt的包装。

在加载use bigint;的范围内,该范围内的所有整数都将透明地升级为Math::BigInt数字。最后,当使用任何类型的大号码库时,请务必不要使用像9**9**9这样的技巧来获得无穷大,因为您可能会等待一段时间:)

+0

我已经接受使用Math :: BigInt/bigint现在是Perl中的最佳解决方案,但我仍然有点失望,尤其是那些使用“Q”的包/解包仅适用于64位版本。 – hippietrail 2010-12-19 06:11:35

1

对不起,先生,bigintMath::BigInt是核心模块的一部分。只要friggin'use其中之一,它将在任何平台上工作。

+2

bigint是迄今为止我找到的最好的解决方案,但是它大大减缓了我的脚本。 Math :: Int64看起来好多了,但它不是核心模块。 – hippietrail 2010-12-15 16:37:39

+2

没有魔法。大数据在非64位平台上运行速度很慢。你不能吃你的蛋糕,吃它。 – wazoox 2010-12-15 20:10:56

+0

32位平台长期以来一直支持64位整数,使用比“大数”更简单的方法,就像16位平台具有32位类型和8位平台具有16位类型一样。当然这些比本地类型慢,但它们比bigint更快。魔术不是必需的。就我而言,我知道我永远不需要完整的64位。 – hippietrail 2010-12-16 05:33:14

2

从用户角度来看,Tcl 8.5的长整数支持是相当不错的。在内部,它表示整数作为任何类型是必要的举行他们(包括bigint)和消耗整数的东西将采取任何他们(虽然可能会强加他们自己的限制;你真的不想使用一个数字,将只适合作为Unix文件模式的bigint ...)

唯一一次你真的需要考虑它的时候是当你打算/从一些固定宽度的二进制格式。这很明显,但(毕竟是固定宽度)。

+0

的确我使用了固定宽度的二进制格式。我在非常大的文本文件中创建了字节偏移量的二进制索引。索引必须是固定的宽度以启用快速二进制搜索。 – hippietrail 2010-12-16 07:10:05

+0

@hippietrail:那么,在这种情况下使用64位值。我从来没有听说任何人有一个数据文件不适合8 EB,但如果你这样做,有两个文件。而'env(DEITY)'祝福你。 :-) – 2010-12-16 08:54:54

3

在Python中,您永远不会发生溢出。相反,python会自动切换它正在使用的数字的实现。基本实现使用平台上的本地整数,但长整数使用无限长数字实现。因此,你永远不必担心你的数字变得太大,python只能自然处理它。

+2

所以你永远不知道为什么你的脚本在一台机器上比另一台机器慢。聪明:) – wazoox 2010-12-15 20:13:21

+1

@wazoox,最好在某些机器上给出不正确的结果,而不是其他的。 – 2010-12-15 20:20:19

+0

似乎Windows上的Python 3的标准分发支持64位整数,即使在具有额外构建参数的32位平台上可以使用64位整数支持来构建Perl,WIndows上的Perl的标准分发也不会。 – hippietrail 2010-12-25 19:23:49