मैं जावा के लिए बहुत नया हूं, और मेमोरी मैपिंग (प्रदर्शन सुधार की उम्मीद में) का उपयोग कर फ़ाइल तक पहुंचने के लिए मैथमैटिका के जावा इंटरफेस का उपयोग करने की कोशिश कर रहा हूं।मैपडबेट बफर का सरणी() विधि क्यों काम नहीं करती है?
मेथेमेटिका कोड मेरे पास है (मेरा मानना है कि) निम्नलिखित जावा कोड (this के आधार पर) के बराबर है:
import java.io.FileInputStream;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
public class MainClass {
private static final int LENGTH = 8*100;
public static void main(String[] args) throws Exception {
MappedByteBuffer buffer = new FileInputStream("test.bin").getChannel().map(FileChannel.MapMode.READ_ONLY, 0, LENGTH);
buffer.load();
buffer.isLoaded(); // returns false, why?
}
}
मैं बफर पर array()
विधि का उपयोग करना चाहते हैं, तो मैं लोड करने के लिए कोशिश कर रहा हूँ load()
का उपयोग कर स्मृति में बफर सामग्री पहले। हालांकि, load()
के बाद भी, isLoaded()
false
लौटाता है, और buffer.array()
अपवाद फेंकता है: java.lang.UnsupportedOperationException at java.nio.ByteBuffer.array(ByteBuffer.java:940)
।
बफर लोड क्यों नहीं करता है और मैं array()
विधि को कैसे कॉल कर सकता हूं?
मेरा अंतिम उद्देश्य asDoubleBuffer().array()
का उपयोग करके double
एस की एक सरणी प्राप्त करना है। विधि getDouble()
सही ढंग से काम करता है, लेकिन मैं उम्मीद कर रहा था कि यह अच्छा प्रदर्शन के लिए एक बार में किया जाए। मैं क्या गलत कर रहा हूं?
जैसा कि मैंने मेथेमेटिका से यह कर रहा हूं, मैं मैं भी (बराबर जावा में ऊपर के लिए) का उपयोग किया वास्तविक मेथेमेटिका कोड पोस्ट करेंगे:
Needs["JLink`"]
LoadJavaClass["java.nio.channels.FileChannel$MapMode"]
buffer = JavaNew["java.io.FileInputStream", "test.bin"]@getChannel[]@map[FileChannel$MapMode`READUONLY, 0, 8*100]
[email protected][]
[email protected][] (* returns False *)
"झूठी वापसी का मूल्य यह इंगित नहीं करता है कि बफर की सामग्री भौतिक स्मृति में निवासी नहीं है।" 'लोड' केवल सर्वोत्तम प्रयास है, और वास्तव में डेटा को केवल भौतिक मेमोरी में लोड कर सकता है ताकि इसे तुरंत बाहर कर दिया जा सके। –
@ टॉमहॉविन-टाइनलाइन मुझे लगता है कि मैंने 'लोड' के उद्देश्य को गलत समझा। मैं जो हासिल करना चाहता हूं वह बफर की सामग्री को युगल की सरणी के रूप में प्राप्त करना है। 'सरणी' विधि अनजाने में काम नहीं करती है, और मैंने जो अपवाद उल्लेख किया है उसे फेंकता है। मैंने यूयर फीडबैक के आधार पर प्रश्न अपडेट किया। – Szabolcs
'सरणी' केवल उन बफर के लिए काम करता है जिन्हें एक सरणी द्वारा समर्थित किया जाता है (आमतौर पर '* बफर.व्रप' से)। –