I recommend you map the file directly into memory, and just type cast the pointer to a pointer to your struct. Then it's a small deal indexing this array.
This is probably as fast as it gets, and you don't have to allocate/deallocate any memory.
Example of the concept:
struct Feature
{
double d1, d2, d3, d4;
int arr[128];
};
HANDLE hFile = ::CreateFile(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
size_t nFileSize = ::GetFileSize(hFile, NULL);
HANDLE hMem = ::CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
Feature *pFeatures = (Feature*)::MapViewOfFile(hMem, FILE_MAP_READ, 0, 0, 0);
size_t featureCount = nFileSize / sizeof(Feature);
for (size_t f = 0; f < featureCount; ++f)
{
Feature *pFeature = &pFeatures[f];
}
Error checking, and closing of the file mapping, omitted.
You might need to align the members in the Feature struct depending on your data. But not as it is right now.
Edit: Minor code changes