2010-12-15 92 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