मल्टीथ्रेडिंग केवल यह धीमा होने जा रहा है जब तक आप एक अलग हार्ड ड्राइव पर प्रत्येक के साथ एकाधिक फ़ाइलों को स्कैन नहीं करना चाहते हैं। अन्यथा आप बस खोज रहे हैं।
मैंने मेमोरी मैप की गई फ़ाइलों का उपयोग करके एक सरल परीक्षण फ़ंक्शन लिखा, एक थ्रेड के साथ एक 1.4 जीबी फ़ाइल स्कैन करने में लगभग 20 सेकंड लग गई। दो धागे के साथ, प्रत्येक आधा फ़ाइल लेता है (यहां तक कि 1 एमबी भाग एक धागे तक, दूसरे के लिए अजीब), इसमें 80 सेकंड से अधिक समय लगा।
- 1 धागा: 20015 मिलीसेकंड
- 2 धागे: 83,985 मिलीसेकंड
यह सही है, 2 धागे चार बार 1 धागा की तुलना में धीमी थी!
यहां मेरे द्वारा उपयोग किया जाने वाला कोड है, यह एकल थ्रेडेड संस्करण है, मैंने 1 बाइट स्कैन पैटर्न का उपयोग किया था, इसलिए नक्शा सीमाओं को पार करने वाले मैचों का पता लगाने के लिए कोड अनचाहे है।
HRESULT ScanForPattern(LPCTSTR pszFilename, LPBYTE pbPattern, UINT cbPattern, LONGLONG * pcFound)
{
HRESULT hr = S_OK;
*pcFound = 0;
if (! pbPattern || ! cbPattern)
return E_INVALIDARG;
// Open the file
//
HANDLE hf = CreateFile(pszFilename,
GENERIC_READ,
FILE_SHARE_READ, NULL,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
if (INVALID_HANDLE_VALUE == hf)
{
hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
// catch an open file that exists but is in use
if (ERROR_SHARING_VIOLATION == GetLastError())
hr = HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION);
return hr;
}
// get the file length
//
ULARGE_INTEGER uli;
uli.LowPart = GetFileSize(hf, &uli.HighPart);
LONGLONG cbFileSize = uli.QuadPart;
if (0 == cbFileSize)
{
CloseHandle (hf);
return S_OK;
}
const LONGLONG cbStride = 1 * 1024 * 1024; // 1 MB stride.
LONGLONG cFound = 0;
LPBYTE pbGap = (LPBYTE) malloc(cbPattern * 2);
// Create a mapping of the file.
//
HANDLE hmap = CreateFileMapping(hf, NULL, PAGE_READONLY, 0, 0, NULL);
if (NULL != hmap)
{
for (LONGLONG ix = 0; ix < cbFileSize; ix += cbStride)
{
uli.QuadPart = ix;
UINT cbMap = (UINT) min(cbFileSize - ix, cbStride);
LPCBYTE pb = (LPCBYTE) MapViewOfFile(hmap, FILE_MAP_READ, uli.HighPart, uli.LowPart, cbMap);
if (! pb)
{
hr = HRESULT_FROM_WIN32(GetLastError());
break;
}
// handle pattern scanning over the gap.
if (cbPattern > 1 && ix > 0)
{
CopyMemory(pbGap + cbPattern - 1, &pb[0], cbPattern - 1);
for (UINT ii = 1; ii < cbPattern; ++ii)
{
if (pb[ii] == pbPattern[0] && 0 == memcmp(&pb[ii], pbPattern, cbPattern))
{
++cFound;
// advance by cbPattern-1 to avoid detecting overlapping patterns
}
}
}
for (UINT ii = 0; ii < cbMap - cbPattern + 1; ++ii)
{
if (pb[ii] == pbPattern[0] &&
((cbPattern == 1) || 0 == memcmp(&pb[ii], pbPattern, cbPattern)))
{
++cFound;
// advance by cbPattern-1 to avoid detecting overlapping patterns
}
}
if (cbPattern > 1 && cbMap >= cbPattern)
{
// save end of the view in our gap buffer so we can detect map-straddling patterns
CopyMemory(pbGap, &pb[cbMap - cbPattern + 1], cbPattern - 1);
}
UnmapViewOfFile(pb);
}
CloseHandle (hmap);
}
CloseHandle (hf);
*pcFound = cFound;
return hr;
}
(2) मई पैटर्न 100 एमबी सीमा तक फैला सकता है? यदि आपको खोज एल्गोरिदम स्वयं लिखना है, और खोज-स्ट्रिंग उचित रूप से लंबी है (अब बेहतर है!), बॉयर-मूर एल्गोरिदम पर विचार करें http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm – Kristen
@ क्रिस्टन: पैटर्न 100 एमबी सीमा नहीं फैलाएगा, क्योंकि पैटर्न थोड़ा '1' है। – Jichao
पैटर्न क्या है, क्या यह वास्तव में एक सेट बिट है? – GalacticJello