|
George_George wrote: And if total image size is large than physical memory size
Then you shouldn't be storing it in memory.
George_George wrote: How to read the full content of a binary file into byte[] or MemoRyStream
As always, and as you've been told an obscene number of times, you read the bloody docs[^] and/or search for relevant examples[^]!
|
|
|
|
|
Thanks J4amieC,
1.
Could Dictionary use virtual memory?
2.
I read a couple of samples, but either for VB or for ASP.Net, which is not my needs. My purpose is simple, just write a console application is fine. And I do not care about the content of image, so I do not care whether use Image class or not. (the samples all use image class)
I read MSDN sample but seems not describing the same problem for me.
Are there an easy to use sample which just convert image file into memory stream or byte[]?
regards,
George
|
|
|
|
|
As far as I know, when you exceed physical memory, the OS will automatically start to use virtual memory. Your program won't know the difference; it will just start to slow down when you're accessing "memory" pages that have been written to disk.
|
|
|
|
|
Thanks Alan,
1.
So, Dictionary itself does not have any special memory limitations and rely on OS correct?
2.
Could you help to provide or recommend some pseudo code which read a full image into memory and store it in memory or byte[] please?
regards,
George
|
|
|
|
|
|
Thanks Alan!
The link in 2 you recommended is for BMP file, I am working on non-BMP file.
Actually I do not care about the specific file format, I just care about how to read the whole content of a binary file into memory, something like this.
Any ideas or sample recommendations?
regards,
George
|
|
|
|
|
It will work for any file type supported by .NET: .bmp, .jpg, .png, .gif, .tif. They all produce a Bitmap structure in memory. The extension tells .NET what file type it is.
|
|
|
|
|
Thanks Alan!
1.
But it does not work for arbitrary file type, like Word and ppt, correct?
2.
Currently, if I do not care about the content of the file, I think I could use the following method to read all content of a image into memory, correct?
byte[] imageData = System.IO.File.ReadAllBytes(filePath);
regards,
George
|
|
|
|
|
1. Correct; just the types supported by .NET.
2. Yes.
|
|
|
|
|
I think you need to read about the concepts of memory management in operating systems, especially about Virtual Memory[^] - there's no connection between a data structure and virtual memory. And thinking about using the full address space of a process is always a very bad idea
regards
modified 12-Sep-18 21:01pm.
|
|
|
|
|
Thanks Greeeg,
1.
It is good to know there is no special limitation of Dictionary itself -- previous I suspect whether Dictionary has special size limitation over OS, e.g. it has a hard coded value 1G size limitation. Good to know there is no such limitation.
2.
I have searched for quite some time to find an easy to learn intuitive sample about how to get the full content of image from physical file into memory, and then make it into disk. Do you have any pseudo code or recommend some samples?
regards,
George
|
|
|
|
|
George_George wrote:
I have searched for quite some time to find an easy to learn intuitive sample about how to get the full content of image from physical file into memory, and then make it into disk. Do you have any pseudo code or recommend some samples?
You can use a FileStream to read the bytes of the image into a byte array and use Image.FromStream() to convert the bytes into an actual Image object.
You can also use the byte array to save it back to the file, a database or whatever you wish.
regards
modified 12-Sep-18 21:01pm.
|
|
|
|
|
Thanks Greeeg,
1.
If I want to use FileStream and read all content of a image file into memory, I want to choose the solution to keep the image in the form of byte[], becaue this solution is extensible to store other type of files, like Word/Excel/etc.
2.
Which API could be used to read the content of all binary file into memory? In my experience, I just read file line by line.
Any hints?
regards,
George
|
|
|
|
|
George_George wrote: Could Dictionary use virtual memory?
All memory that you use is virtual. You don't know if and where in the physical memory the data is loaded.
George_George wrote: Are there an easy to use sample which just convert image file into memory stream or byte[]?
Why don't you store the Image objects in the Dictionary?
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
Thanks Guffa!
Guffa wrote: Why don't you store the Image objects in the Dictionary?
Because I want to make my code transparent and suitable for all situations, e.g. in the future I may use the same code to store Word and Excel files.
I have searched for quite some time to find an easy to learn intuitive sample about how to get the full content of image from physical file into memory, and then make it into disk. Do you have any pseudo code or recommend some samples?
regards,
George
|
|
|
|
|
George_George wrote: I have searched for quite some time to find an easy to learn intuitive sample about how to get the full content of image from physical file into memory
byte[] imageData = System.IO.File.ReadAllBytes(filePath);
George_George wrote: and then make it into disk
What do you mean by that?
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
Thanks Guffa,
"What do you mean by that?" -- sorry my English is bad. I mean deserialize the image into disk. My usage scenario is, hold all image into memory in Dictionary object, then per query from clients, I will deserialize the image into disk so that the client could acess requested image.
Do you think my simple and quick solution is fine according to my usage scenario?
regards,
George
|
|
|
|
|
Why on earth would you keep the images in memory if you want to store them to disk before they are accessed? That only seems like a waste of memory and time.
How are the clients accessing the images? Do you really have to save them to disk to make them accessible?
George_George wrote: I mean deserialize the image into disk.
That doesn't make sense, as the images are not serialized...
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
Thanks Guffa,
1.
I am writing a web services which returns image by user ID. Previously I store images on disk which is very slow because I need to read all of them into memory each time before I send to requested client. The clients are web servers, which display user related image, like self-photo.
Do you think my solution of using Dictionary to hold image content could achive this goal?
2.
Guffa wrote: That doesn't make sense, as the images are not serialized... My typo - I mean serialize.
So, now from my background, do you think the solution we discussed so far could achive my goal?
regards,
George
|
|
|
|
|
So, if I ignore the parts that doesn't make sense, you are saying that you want to cache the files in memory so that you can return them from a web service?
That would work, but I really don't think that the disk access is your performance problem...
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
Why Guffa? Disk is slower than memory, I think there should be performnace improvements.
regards,
George
|
|
|
|
|
Yes, but I don't think that the disk access i the bottle neck. Besides, if you read a file it will be in the disk cache, so next time you will actually be reading it from memory. And if you store too much in memory, some of it will be swapped to disk, so you will be reading some images from disk anyway...
Have you checked how much network bandwidth you are using?
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
Thanks Guffa!
The bandwidth between machine is 1G since it is network center internal high speed machine connection between the same sub-network.
Previous the images are stored in database as blob data type, it is several hundred M bytes (about 1G) footprint, I think if I could cache them all into memory, the performance could be improved, any comments?
(the reason why I think performance will be improved is the image retrieval is almost random, so I do not think disk cache could work well in a random access pattern.)
regards,
George
|
|
|
|
|
Say i had this class:
public sealed class Partner
{
string something;
string somethingelse;
List<Customer> customers = new List<Customer>();
public List<Customer> Customers
{
get { return customers; }
}
} Is this bad practice? If so, how can i make it right and still be able to get all the methods a List<> provides? I know i could use class Partner : List<Customer> but inside Customer there's two Lists so that solution won't work there. Is it really necessary that i write a custom List for each object, just to maintain good coding practice? I'm asking because my teacher says that the above example is bad OOP - and because i'm developing an application that really needs the methods a List<> provides....
modified on Wednesday, November 26, 2008 8:22 AM
|
|
|
|
|
I think your generics got swallowed by the HTML monster!
xacc.ide - now with TabsToSpaces support IronScheme - 1.0 beta 1 - out now! ((lambda (x) `((lambda (x) ,x) ',x)) '`((lambda (x) ,x) ',x))
|
|
|
|