2013-07-21 11 views
5

को संभाल नहीं सकता है मुझे 3 आयामों में लुकअप टेबल का उपयोग करने की आवश्यकता है। तालिका में 73x73x73 (38 9 017) डबल मान हैं।जीएचसी बड़ी लुकअप टेबल

module Hammer.Texture.Table3D where 

import qualified Data.Vector   as V 
import qualified Data.Vector.Unboxed as U 

import   Data.Vector.Unboxed (Vector) 

table3D :: V.Vector (V.Vector (Vector Double)) 
table3D = V.fromList [table0, table1, ... table72] 

table0 = V.fromList $ map U.fromList [ 
    [1.973921e+01, 0.000000e+00, ... 0.000000e+00], 
    ..... 
    [1.973921e+01, 0.000000e+00, ... 0.000000e+00]] 
..... 
table72 = V.fromList $ map U.fromList [ 
    [1.973921e+01, 0.000000e+00, ... 0.000000e+00], 
    ..... 
    [1.973921e+01, 0.000000e+00, ... 0.000000e+00]] 

समस्या यह है कि GHC वेक्टर डबल या [डबल] के इस आकार को संभाल नहीं सकता, GHC संकलन बहुत समय लेता है (~ 2 मिनट), जब तक, अंत में, स्मृति चल रही है। ऐसा लगता है कि जीएचसी या कुछ बग पर एक स्मृति रिसाव है क्योंकि यह बहुत बड़ी स्ट्रिंग ([चार]) के लिए ठीक काम करता है।

जीएचसी का उपयोग करके "बड़ी" लुकअप टेबल (डबल टाइप) बनाने के लिए कौन से समाधान, यदि कोई हैं, उपलब्ध हैं?

+1

क्या आपने इसके बजाय 'Data.Array' या' Data.Array.Repa' जैसे सरणी का उपयोग करने का प्रयास किया है? ऐसा लगता है कि आपको एक निश्चित आकार के कंटेनर की आवश्यकता है, फिर एक वेक्टर –

+1

तो ... यह एक तालिका की तरह पूरी तालिका के साथ 10 एमबी स्रोत फ़ाइल है, जैसे? आप ऐसा क्यों करेंगे? मुझे पूरा यकीन है कि रनटाइम पर ऐसे बड़े 'वेक्टर' उत्पन्न करने में कोई समस्या नहीं होगी, बाइनरी फ़ाइल से अधिक कुशलतापूर्वक पढ़ें। हालांकि मैं केवल स्रोत में डाल रहा हूं, 'आईओ' से आसानी से दूर रहने का एक अच्छा तरीका है। – leftaroundabout

+1

यदि स्ट्रिंग के साथ ठीक चलता है ... हार्डकोड स्ट्रिंग क्यों नहीं (डबल्स नहीं)? (फिर निश्चित रूप से 'पढ़ा'), बदसूरत है लेकिन शायद ठीक चलाता है ... – josejuan

उत्तर

8

मैं दो संभावनाएं के बारे में सोच सकते हैं:

  1. एक फाइल करने के लिए वैक्टर को क्रमानुसार, और कार्यक्रम के प्रारंभ होने पर उन्हें deserialize (शायद unsafeInterleaveIO का उपयोग कर यदि आप इस चाहते हैं तो होना ही जब लुकअप तालिका पहले के बजाय प्रयोग किया जाता है जब कार्यक्रम शुरू होता है)।
  2. यदि लुकअप टेबल वास्तव में आपके छद्म कोड के सुझाव के रूप में स्पैस है, तो एक स्पैस डेटा संरचना का उपयोग करने पर विचार करें - उदा। Data.Map या यहां तक ​​कि सिर्फ एक सादा समारोह। यदि आवश्यक हो, तो आप अपने वैक्टर उत्पन्न करने के लिए इस स्पैस डेटा संरचना का उपयोग कर सकते हैं (फिर रनटाइम पर)।
संबंधित मुद्दे