2013-06-17 3 views
1

친애하는 StackOverflow 사용자!VB6 배열의 최대 크기

저는 최근에 VB6에서 문제를 해결할 특별한 방법이 필요했습니다. 나는 메모리에 매우 많은 양의 데이터를 임시로 저장해야하는 애플리케이션을 개발했다. 클래스와 클래스 멤버는 리소스를 늘리고 언로드하는 데 더 많은 시간을 필요로하므로 배열을 사용하는 아이디어가 나타났습니다. 그러나 내 컴퓨터에서 사용 가능한 모든 RAM을 사용할 수없는 것 같습니다. 아무도 내가 이것을 해결할 수있는 방법에 대한 아이디어를 줄 수 없었을까요?

감사합니다.

+0

동일한 문제가 생겼으며 여러 개의 작은 배열로 데이터를 분할하는 데 많은 시간이 걸리지 않았습니다. 거대한 코드를 다시 작성해야하기 때문입니다. 어쩌면 당신의 경우에는 그저 많이 simpeler. 적어도 배열의 최대 크기가 컴퓨터의 사용 가능한 RAM보다 훨씬 작다는 것을 확인할 수 있습니다. 메모리 관리자가 빈 메모리 블록을 찾아야하기 때문에 이상하지 않습니다. 그러나 VB6에는 추가적인 인공적 한계가있는 것 같습니다. – Muis

+0

배열을 만들지 않고 파일 (어쩌면 xml, csv 등)에 데이터를 쓸 수 있습니까? –

+0

불행히도 파일에 데이터를 쓰는 것은 작동하지 않습니다. 배열에 포함 된 정보를 처리해야하기 때문입니다. 그리고 이것은 디스크보다 메모리에서 훨씬 빠릅니다. –

답변

1

"컴퓨터의 모든 RAM"이 의미하는 바에 달려 있습니다. VB6 컴파일러를 사용하는 경우 32 비트이므로 VB6에서 한 번에 처리 할 수있는 최대 메모리 양이므로 RAM의 2G를 표준으로 사용할 수 있습니다. EDITBIN.EXE를 사용하여/3G 창 또는 Win64 컴퓨터에서 3G를 활용할 수있는 실행 파일을 해킹하는 것이 가능할 수도 있지만 작동하면 놀라실 것입니다.

가장 좋은 방법은 임시 파일에 데이터를 쓰는 것입니다. VB6에는 파일 크기에 대한 2G 제한이 동일하므로 CreateFile()/ReadFile() WinAPI 호출을 사용하여 파일 액세스를 수행해야합니다.

1

VB6의 배열 크기 제한은 부호있는 32 비트 정수 또는 2,147,483,647 개의 요소 중 가장 큰 값입니다.

실제로는 32 비트 프로그램의 전체 주소 공간을 충분히 커버해야하지만 64 비트 OS를 실행하는 최신 컴퓨터의 전체 RAM 할당을 사용하지는 않습니다.

이 처리 단계를 64 비트 주소 공간을 지원하는 다른 언어로 작성하고 VB6 프로그램에서이 프로그램을 실행한다고 생각하십니까?

실제로는 VB3에서 동일한 문제가 발생했습니다. 이는 단지 2^15-1 요소의 배열을 허용했기 때문에 큰 저항이었습니다. 33,000 개 요소 아래에서 많은 시스템의 메모리 정렬이 비실용적이었습니다.

+0

이슈에 대한 연구 필자는 필자가 직면 한 몇 가지 매우 중요한 문제를 직면하게되었다. 예를 들어 고정 된 크기의 문자열 배열을 15,000,000 개라고 말하면 Dim A (15000000)를 String으로 만들면 문제가 없습니다. 그러나 실제 문제는 배열을 채울 때 발생합니다. 요소 길이가 충분히 짧으면 문제가 없습니다. 그러나 255 자에 가까워지면 프로그램이 중단됩니다. 누군가가 위대한 의견을 말할 수 있다면. 아니면 다른 질문을해야합니까? –

+0

VB6의 문자열은 구조체이므로 배열을 저장할 때 해당 메모리를 할당하지 않습니다. 대신 당신이 얻을 null 포인터의 배열입니다 (그들은 내부적으로 BSTR 구조체, http://msdn.microsoft.com/en-us/library/windows/desktop/ms221069(v=vs.85).aspx); VB6 그냥 편의를 위해 빈 문자열로 null 문자열 포인터를 동일시 생각합니다. 문자열을 할당하면 더 많은 메모리가 BSTR 구조체에 사용됩니다. – Adrian