2016-11-02 3 views
-1

명확하게 설명합시다.메모리의 저장소에 대한 참조를 가진 가상 파일을 만드는 방법

  • 이의이 인자로 파일 이름을 소요하는 '-f'로 지정된 옵션이 명령이 있다고 가정 해 봅시다 :

    다음은 내 요구 사항입니다.

  • 이제 5 개의 파일이 있고이 5 개의 파일을 병합하는 새 파일을 만들고 위의 명령에 대한 인수로 새 파일 이름을 지정하려고합니다.
  • 그러나 병합 된 파일을 읽는 모든 파일 &을 병합 하나의 파일 및

  • 를 읽고

    1. 차이가있다.
  • 더 IO가 (+ 병합 된 파일에 쓸 5 개 파일에서 읽기 + 우리의 명령은 지정된 파일과 않는 IO) IO보다 두 번째 경우에 생성 된 (모든 IO 우리의 명령은 주어진 파일로 수행)를 생성합니다.

우리는이 원치 않는 IO를 줄일 수 있습니까?

결국 나는 병합 된 파일을 전혀 원하지 않습니다. 이 병합 된 파일을 만들면 명령이 병합 된 파일 내용을 읽을 수 있습니다.

그리고이 구현을 원하지 않습니다. 파일 크기가 그렇게 크지 않기 때문에 무시할 수있는 IO를 추가해도 괜찮습니다. 그러나 이것이 가능할 수 있는지 궁금합니다.

그래서이를 구현하기 위해, 나는 다음과 같은 한 이해/질문 :

  • 일반적으로 무엇을 모든 명령 (즉, 파일 이름 인수를) 수행이 파일을 읽고 있습니다.
  • 우리의 경우 파일 이름 (filepath)이 준비되지 않았습니다. 모든 파일의 병합으로 존재하는 가상/상상의 파일 이름입니다.
  • 그런 가상 파일 이름을 만들 수 있습니까?
  • 파일 이름이란 무엇입니까? 저장소 위치에 대한 간접 inode 항목입니다.
  • 우리의 경우, 개별 파일은 다른 inode 항목을 가지며 모든 inode 항목은 다른 저장 위치를가집니다. 우리의 가상/가상 파일은 실제로 inode가 없으며 가상의 inode를 생성 할 수 있다고해도 메모리의 저장소만을 가리킬 수 있습니다 (한 파일의 저장 위치에있는 다른 파일의 저장 위치에 대한 참조가 없으므로
  • 하지만 고급 프로그래밍을 사용하여 메모리의 저장소를 가리키는 가상의 inode가있는 상상의 파일 경로를 만들 수 있다고 가정 해 보겠습니다.
  • 이제 상상의 파일 이름을 인수로 지정하고 명령이 가상 파일을 열려고하면 inode 항목이 메모리의 저장소를 참조하고 있음을 알게됩니다. 그러나 실제 내용은 디스크에 있고 메모리에는 없습니다.따라서 데이터를 명시 적으로 읽지 않는 한 데이터는 메모리에로드되지 않습니다. 따라서 다시 데이터를 먼저 읽어야합니다. 연속성 또는 다음 파일 데이터를 디스크에 저장에서 참조가 없기 때문에

는 단순히 병합 된 데이터가 먼저 메모리에로드해야 말.

따라서 공제를 통해 적어도 데이터를 메모리에 저장해야합니다. 그러나 명령 자체가 파일을 읽을 필요가 있기 때문에 (전체 파일이 아니라면 명령의 작업이 완료 될 때까지 파일의 일부 또는 전부를 파싱해야합니다). 따라서이 방법을 사용하면 큰 파일 인 경우 상당한 IO를 절약 할 수 있습니다.

그럼 어떻게 가상 파일을 만들 수 있습니까?

  • 첫 번째 대답은 병합 된 파일을 tmpfs에 쓰고 해당 파일을 참조하는 것입니다. 그러나 유일한 옵션입니까, 아니면 실제로 tmpfs가 아닌 메모리의 저장 위치를 ​​가리킬 수 있습니까? tmpfs는 옵션이 아니기 때문에 모든 서버에서 스크립트를 실행할 수 있으며 모든 서버에서 작동하는 솔루션이 필요합니다. 내 스크립트에서/dev/shm에 병합 된 파일을 작성한다고 언급하면 ​​/ dev/shm이없는 서버에서 실패 할 수 있습니다. 그래서 나는 직접 메모리에로드 할 수 있어야합니다. 하지만 일반 사용자는 메모리에 액세스 할 수 없으므로 shm 없이는 할 수없는 것 같습니다.

귀하의 의견을 알려 주시고 친절하게도 내 이해가 잘못되어 있으면 저를 고쳐주십시오. 내 수준에서 복잡해도 친절하게 답을 게시하십시오. 적어도, 나는 몇 달 후에 그것을 이해할지도 모른다.

+0

일부 저글링을 사용하면 프로세스가 명명 된 파이프에서 읽힐 수 있습니다. 그 파이프)'파일 이름은 무엇입니까? '* 아이 노드에 대한 * 포인터를 포함하는 디렉토리 항목입니다. (그 숫자) – wildplasser

+0

안녕하세요, 사실 파일 이름 인수 만 제공 할 수 있고 이진 파일이므로 해킹 할 수 없습니다 –

+0

: (1) [binary blob] 명령을 변경할 수 없습니다.(2) 출력 파일에 대해 신경 쓰지 않아야합니다. (3) 명령이 출력 파일에 기록되지 않도록 할 수 없습니다. 시도해보십시오 :'cmd -f/dev/null f1 f2 f3 f4 f5'. 그것은 그것이 얻는만큼 빨리이다. 그게 효과가없는 이유가 뭐야? –

답변

0

fifo (명명 된 파이프)를 만들고 이름을 프로그램의 인수로 제공하십시오. 다섯 개 개의 입력 파일 결합 프로세스는

  • cp wtf omg

  • [다른 단말로부터] ...이 FIFO

    • mkfifo wtf
    • cat file1 file2 file3 file4 file5 > wtf이 차단 #에를 쓴다 여기에 cp을 프로그램으로 사용하고 cat을 프로그램 combini로 사용했습니다. 다섯 개의 파일. omg은 프로그램의 출력 (여기에는 cp)을 포함하며 첫 번째 터미널은 프로그램이 완료된 후의 첫 번째 터미널 차단을 해제한다는 것을 알 수 있습니다. (여기 : cp)


      귀하의 프로그램은 첫번째 인수 wtf는 FIFO에 참조하는 경우에도 인식하지 못합니다; 보통 파일을 열 때처럼 열어서 읽습니다. (프로그램이 파일에서 탐색을 시도하면 실패하고, 파이프와 FIFO에 대해서는 seek()가 구현되지 않습니다)

    +0

    왜 당신은 결합하는 것이 파일을 연결한다는 것을 생각합니까? 왜 그들을 어떻게 합병하지 않습니까? 또는 바이트 모드 256으로 바이트를 추가 하시겠습니까? 우주에 파일을 결합하는 방법은 몇 가지가 있습니까? –

    +0

    네, 맞습니다. 나는 내 말을 바로 잡을 것이다. –

    +1

    @LuisColorado 그냥 * 최소 예입니다. 그리고 5 개의 파일을 결합하는 것은 별도의 프로세스로 수행되므로 모든 프로세스가 될 수 있습니다. 게다가 : OP는 5 개의 파일을 결합하는 방법에 대해 분명하지 않았습니다. – wildplasser

    관련 문제