สนับสนุนโดย

วันศุกร์ที่ 28 ธันวาคม พ.ศ. 2561

การใช้ Memory Map File

ในระบบปฏิบัติการทั่วไป จะทำการดึงไฟล์มาใส่ใน memory ไว้ เพื่อความเร็วเมื่อต้องการประมวลผลเกี่ยวกับไฟล์ สำหรับการเขียนโปรแกรม java เราเองก็สามารถจัดการได้เช่นกัน เราเรียกกันว่า memory map file นั่นก็คือการเอา หน่วยความจำ ไปผูกไว้กับไฟล์ นั่นเอง เพื่อให้ทราบว่าไฟล์ที่ดึงเข้ามานี้ อยู่ตำแหน่งใด ของหน่วยความจำ

ให้สร้าง package ชื่อว่า memoryMap จากนั้นสร้างไฟล์ MemoryMapTest.java เขียนโค้ดลงไปดังนี้


เพื่อความชัวร์ เช็คกันก่อนว่าเรามีไฟล์ employee.dat อยู่ในตำแหน่งดังนี้


ตัวอย่างโค้ด
package memoryMap;

import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.file.*;
import java.util.zip.*;

public class MemoryMapTest {

    public static long checksumInputStream(Path filename) throws IOException {
        try (InputStream in = Files.newInputStream(filename)) {
            CRC32 crc = new CRC32();

            int c;
            while ((c = in.read()) != -1) {
                crc.update(c);
            }
            return crc.getValue();
        }
    }

    public static long checksumBufferedInputStream(Path filename) throws IOException {
        try (InputStream in = new BufferedInputStream(Files.newInputStream(filename))) {
            CRC32 crc = new CRC32();

            int c;
            while ((c = in.read()) != -1) {
                crc.update(c);
            }
            return crc.getValue();
        }
    }

    public static long checksumRandomAccessFile(Path filename) throws IOException {
        try (RandomAccessFile file = new RandomAccessFile(filename.toFile(), "r")) {
            long length = file.length();
            CRC32 crc = new CRC32();

            for (long p = 0; p < length; p++) {
                file.seek(p);
                int c = file.readByte();
                crc.update(c);
            }
            return crc.getValue();
        }
    }

    public static long checksumMappedFile(Path filename) throws IOException {
        try (FileChannel channel = FileChannel.open(filename)) {
            CRC32 crc = new CRC32();
            int length = (int) channel.size();
            MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, length);

            for (int p = 0; p < length; p++) {
                int c = buffer.get(p);
                crc.update(c);
            }
            return crc.getValue();
        }
    }

    public static void main(String[] args) throws IOException {
        System.out.println("Input Stream:");
        long start = System.currentTimeMillis();
        Path filename = Paths.get("employee.dat");
        long crcValue = checksumInputStream(filename);
        long end = System.currentTimeMillis();
        System.out.println(Long.toHexString(crcValue));
        System.out.println((end - start) + " milliseconds");

        System.out.println("Buffered Input Stream:");
        start = System.currentTimeMillis();
        crcValue = checksumBufferedInputStream(filename);
        end = System.currentTimeMillis();
        System.out.println(Long.toHexString(crcValue));
        System.out.println((end - start) + " milliseconds");

        System.out.println("Random Access File:");
        start = System.currentTimeMillis();
        crcValue = checksumRandomAccessFile(filename);
        end = System.currentTimeMillis();
        System.out.println(Long.toHexString(crcValue));
        System.out.println((end - start) + " milliseconds");

        System.out.println("Mapped File:");
        start = System.currentTimeMillis();
        crcValue = checksumMappedFile(filename);
        end = System.currentTimeMillis();
        System.out.println(Long.toHexString(crcValue));
        System.out.println((end - start) + " milliseconds");
    }
}

ผลการทำงาน
Input Stream:
26b1ad3f
12 milliseconds
Buffered Input Stream:
26b1ad3f
0 milliseconds
Random Access File:
26b1ad3f
2 milliseconds
Mapped File:
26b1ad3f
1 milliseconds

ไม่มีความคิดเห็น:

แสดงความคิดเห็น