킬로바이트 블록 및 포인터의 모든 가능한 순열의 메모리가 가능합니까?


23

이것은 내 머리를 감싸기에 충분하지 않은 아이디어이며 알고있는 사람들이 더 잘 읽을 수 있도록 편집 / 도움을 주시면 감사하겠습니다.

이론적으로 1 킬로바이트의 가능한 모든 이진 순열의 사본 하나를 저장 한 다음 시스템의 나머지 부분에 단순히 이러한 위치에 대한 포인터를 작성하는 하드 드라이브를 가질 수 있습니까?

시스템이 단순히 정보를 직접 저장하는 것보다 더 빠른 방법일까요?

다른 방법으로 설명하려면 문장 대신 말하십시오.

"안녕 밥입니다." "그 샌드위치 맛있겠다."

... 하드 드라이브에 저장하면 알파벳과 다른 문자의 모든 순열 (최대 1000 자 정도)을 입력 한 다음 문장을 다음과 같이 저장합니다.

[포인터 # 21381723]


21
당신은 고려하실 수 있습니다 영어 트윗이 가능합니다 얼마나 많은 독특한? 세계 인구가 모두 소리내어 읽는 데 얼마나 걸립니까? . 당신은 매우 큰 숫자를 다루고 있습니다.

content addressable 이라는 git의 작동 방식이 흥미로울 것 입니다.
JDługosz

5
github.com/philipl/pifs kb의 모든 순열 대신 pi를 사용한다는 점을 제외하면 아이디어와 동일한 원칙을 기반으로합니다.
Waxen

12
포인터의 길이는 1 킬로바이트 여야합니다. 영어로 이해되지 않는 블록을 저장하지 않도록 선택할 수 있습니다.이 경우 압축 개념을 독립적으로 재창조했습니다!
user253751

기본 대답은 아니요입니다-순열의 #과 크기로 인해 불가능합니다. 그러나 가능한 응용 프로그램은 가능하다면 유용 할 것이라고 생각 했습니까 ??
대천사

답변:


91

2 개의 8192 개의 서로 다른 1K 블록이 있습니다. 그것들을 모두 저장하려면 2 8202 비트의 저장 공간이 필요합니다. 우주에는 약 10 80 (또는 ~ 2 266 )의 입자 만 포함되어 있기 때문에 모든 입자 를 저장할 수 없다는 것이 안전 합니다. 시간을 절약 할 수 있을지 궁금하지 않아도됩니다.

그러나 실제로 이에 대한 더 흥미로운 방법이 있습니다. 거대한 상수 풀에 인덱스를 생성하는 것이 좋습니다. 그러나 역 참조 할 인덱스를 어떻게 알 수 있습니까? 당신이 저장하려는 인수를 위해 상상 만 1 문자 블록 : a, b, c... 그 그 블록을 저장하는 가장 효율적인 레이아웃 이후 아마도 당신의 인덱스는 0, 1, 2 등이 될 것입니다.

합의에 대해 뭔가 알아 차렸습니까? 실제로 인덱스는 저장된 데이터의 코드화 된 표현입니다 ! 다시 말해, 당신은 전혀 역 참조 할 필요가 없으며, 색인을 원하는 데이터로 변환하면됩니다.

당신이 저장되면 모든 테이블에 뭔가의 가능한 값이 항상 발생합니다 색인은 단순히 데이터 자체의 인코딩 된 버전이된다, 그래서 데이터가 처음에 불필요하게 저장. 이 이유는 현실 세계에서, 인덱스는 스파 스 데이터 (방문한 예를 들어 모든 웹 페이지, 모든 웹 페이지에서만 유용 존재할 수 , 심지어 모든 것을 존재).


17
따라서 우리는 이미이 시스템을 사용하고 있지만 킬로바이트 크기의 비트 패턴에 대한 지연 평가를 통해이를 수행하고 있으며,이를 통해 수많은 저장 공간 을 절약 할 수 있습니다 !
Theodoros Chatzigiannakis

3
중복으로 인해 스토리지가 약간 줄어 듭니다 (1024 0,이어서 1,024 개의 고유 패턴 포함). 또한 1KB 블록은 2 <sup> 10 </ sup>이 아니라 2 <sup> 13 </ sup> 비트입니다.
벤 보이 그

2
유니버스의 입자에 대한 10 ^ 80 제한은 유니버스 에 10 ^ 80 비트 이상을 저장할 수 없다는 것을 직접 의미 하지는 않습니다. 각 입자마다 잠재적으로 둘 이상의 정보를 저장할 수 있기 때문입니다 ( 우주 내에서의 위치와 속도 등을 기반으로). 그렇다고 1K 블록마다 저장할 있다는 의미는 아닙니다. 그 수는 엄청나게 큰 입자로 입자 수를 초과하므로 모든 것을 저장할 수는 없습니다.
psmears

2
@Neil 10 ^ 80을 "10 ^ 80"으로 인코딩하여 10 ^ 80을 저장할 수있는 코딩 시스템이 있다면 "10 ^ 80"을 어떻게 저장합니까? 일부 데이터 조각이 실제 데이터보다 짧은 인코딩 된 경우 다른 데이터는 더 오래 인코딩해야합니다. 또는 모든 데이터 조각이 숫자 인 경우 각 10 진수를 전체 바이트로 저장합니다.
Random832

3
함께 브루 서열 드 2 ^ 1024 비트가 충분하다.
gronostaj

20

다른 사람들이 이미 지적했듯이 1k 블록에 대해 2 ^ 8192 가능성이 있습니다. 즉, 모든 블록 주소가 같은 양의 비트로 인코딩되면 주소의 길이가 1k가 될 경우 블록의 주소를 인코딩하려면 8192 비트가 필요합니다. 간접 레이어를 추가하는 것 외에는 아무것도 얻지 못하므로 성능을 얻지 못합니다.

더 짧은 주소를 원한다면 짧은 주소로 일부 블록을 인코딩하고 일부는 더 긴 블록으로 인코딩하여 긴 블록이 자주 표시되지 않도록해야하며 이제는 데이터를 압축하고 있습니다. 허프만 코드 ). 저장하기 전에 저장하는 데이터에 대한 지식이 있거나 인코딩을 정기적으로 변경해야합니다. 길이가 다른 블록을 사용하는 다른 압축 알고리즘보다 효율성이 떨어질 수 있습니다.


1

그것에는 두 가지 문제가 있습니다.

첫째, "1 킬로바이트의 모든 가능한 이진 순열"은 엄청난 양의 데이터입니다. 1024 바이트 * 바이트 당 8 비트 = 킬로바이트 단위의 8192 비트 가능한 모든 순열은 2 ^ 8192입니다. 약 1.09e+2466킬로바이트입니다! (비교를 위해 1TB 드라이브는 1e09킬로바이트입니다.)

둘째, 거대한 테이블이 있고 포인터를 사용하여 색인을 생성 한 경우에도 정확히 1KB보다 작은 데이터를 참조하려면 어떻게해야합니까?


2
1KB보다 작은 모든 블록을 저장하면 더 많은 공간을 차지하지 않습니다. 바이트 크기의 블록 만 가정하면 작은 블록의 크기는 1KB 블록 크기의 1/256보다 약간 높습니다. 비트 크기 블록을 가정하면 대략 같은 크기를 다시 추가합니다.
Paŭlo Ebermann

-1

다른 포스터가 지적했듯이 어느 시점에서 가능한 모든 값 목록에 색인을 생성하는 데 필요한 포인터 크기는 이득을 무효화합니다.

그러나 일부 언어는 메모리 사용을 최적화하기 위해 제안한 내용의 제한된 버전을 사용합니다. 파이썬은 문자열 'interning'을 사용하여 메모리의 중복 문자열 수를 줄입니다. 'python string intern'을 검색하여 자세한 정보를 찾을 수 있습니다.


1
OP는 모든 순열을 포함하는 고밀도 집합에 대해 묻고 있습니다. 포인터는 스파 스 데이터에만 유용합니다. 포인터를 유지하는 데 필요한 비트가 가리키는 비트보다 작습니다. 중복은 중복으로 인해 공간이 더 좁아 질 수 있으므로 연결이 있지만 실제로 대답이 잘 표현되지는 않습니다.
Peter Cordes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.